Unity3d 计算包含旋转的长方体的边界

Unity3d 计算包含旋转的长方体的边界,unity3d,rotation,quaternions,bounds,qvector3d,Unity3d,Rotation,Quaternions,Bounds,Qvector3d,我正在为使用自定义碰撞器的游戏开发碰撞系统。我曾经为碰撞创建边界框 我遇到了一个框的问题,其中右键和向前键的值被用来创建框。否则就没问题了。任何人都知道如何在计算立方体的8个点时包含右向量和前向量 下面是我计算点数的代码: public static void GetBoundsPointsNoAlloc(BoxRegion bx, Matrix4x4 colliderBox4x4,Vector3[] points, Matrix4x4 mx) { Transform tr = Utils.

我正在为使用自定义碰撞器的游戏开发碰撞系统。我曾经为碰撞创建边界框

我遇到了一个框的问题,其中右键和向前键的值被用来创建框。否则就没问题了。任何人都知道如何在计算立方体的8个点时包含右向量和前向量

下面是我计算点数的代码:

 public static void GetBoundsPointsNoAlloc(BoxRegion bx, Matrix4x4 colliderBox4x4,Vector3[] points, Matrix4x4 mx) {
 Transform tr = Utils.FromMatrix4x4(ref DebugCollisionTestSphere.trans,mx);

 Vector3 v3Center = bx.center;
 Vector3 v3ext = bx.GetExtents();
 Vector3 right = bx.right;
 Vector3 forw = bx.forward;

   //Quaternion qua =Quaternion.LookRotation(bx.forward,Vector3.Cross     (bx.forward, bx.right));

   //tr.TransformDirection (bx.forward);
   //tr.localRotation = qua;
   tr.forward = bx.forward;
   tr.right =   bx.right;
   //tr.rotation = qua;

 points [0] = tr.TransformPoint (new Vector3 (v3Center.x - v3ext.x, v3Center.y + v3ext.y, v3Center.z - v3ext.z));  // Front top left corner
 points [1] = tr.TransformPoint (new Vector3 (v3Center.x + v3ext.x, v3Center.y + v3ext.y, v3Center.z - v3ext.z));  // Front top right corner
 points [2] = tr.TransformPoint (new Vector3 (v3Center.x - v3ext.x, v3Center.y - v3ext.y, v3Center.z - v3ext.z));  // Front bottom left corner
 points [3] = tr.TransformPoint (new Vector3 (v3Center.x + v3ext.x, v3Center.y - v3ext.y, v3Center.z - v3ext.z));  // Front bottom right corner
 points [4] = tr.TransformPoint (new Vector3 (v3Center.x - v3ext.x, v3Center.y + v3ext.y, v3Center.z + v3ext.z));  // Back top left corner
 points [5] = tr.TransformPoint (new Vector3 (v3Center.x + v3ext.x, v3Center.y + v3ext.y, v3Center.z + v3ext.z));  // Back top right corner
 points [6] = tr.TransformPoint (new Vector3 (v3Center.x - v3ext.x, v3Center.y - v3ext.y, v3Center.z + v3ext.z));  // Back bottom left corner
 points [7] = tr.TransformPoint (new Vector3 (v3Center.x + v3ext.x, v3Center.y - v3ext.y, v3Center.z + v3ext.z));  // Back bottom right corner
 }

当我应用四元数进行变换时,长方体正在改变其位置。让我们根据Unity3D框架中本机可用的类来重新定义此问题。如果你对数学理解得足够好,你可以把它应用到你正在使用的其他课程中

如果您只需要一个(或AABB),那么您可以通过其各自的
边界
属性从任何
渲染器
碰撞器
轻松获得该属性。这是一个快速的解决方案,在许多情况下就足够了

其他一些边界框用局部空间表示——例如,
Mesh
具有位于局部空间的
bounds
属性。无论出于何种原因,您有时会有一个放大、向右、向前的长方体,您可能需要将该长方体的点转换为世界空间

假设我们的盒子看起来像这样:

       size.x
   .+------+
 .' |    .'|
+---+--+'  | size.y      (all around some point 'center')
|   |  |   |
|  ,+--+---+
|.'    | .' size.z 
+------+'   
假设我们有一个以零为中心的单位立方体:

Vector3 center = Vector3.zero;
Vector3 size = Vector3.one;
长方体的范围为其大小的一半:

Vector3 extents = size * 0.5f;
这使得计算长方体周围的八个点变得足够简单:

Vector3[] points = new Vector3[8];
points[0] = center + new Vector3( extents.x,  extents.y,  extents.z);
points[1] = center + new Vector3( extents.x,  extents.y, -extents.z);
points[2] = center + new Vector3( extents.x, -extents.y,  extents.z);
points[3] = center + new Vector3( extents.x, -extents.y, -extents.z);
points[4] = center + new Vector3(-extents.x,  extents.y,  extents.z);
points[5] = center + new Vector3(-extents.x,  extents.y, -extents.z);
points[6] = center + new Vector3(-extents.x, -extents.y,  extents.z);
points[7] = center + new Vector3(-extents.x, -extents.y, -extents.z);
这些点仍然都在局部空间中。我们只需要一个
transform
组件将它们转换为世界空间:

for (int i=0; i<8; i++) {
    points[i] = transform.TransformPoint(points[i]);
}

for(int i=0;i您需要将长方体的方向(存储为向右和向前)连接到世界变换。类似的操作可能会起作用:

Vector3 fwd=bx.forward.normalized(), rt=br.right.normalized(), up=fwd.Cross(rt);
Quaternion qbox; qbox.SetLookRotation(fwd,up);
tr.rotation = tr.rotation*qbox;
(由于Unity是令人烦恼的左撇子,您可能需要稍微修改符号和连接顺序,或者在SetLookRotation中使用rt而不是fwd)

更新:在聊天中讨论之后,这似乎是最终的工作版本

Quaternion quat = Quaternion.identity; 
quat.SetLookRotation(bx.forward, Vector3.Cross(bx.forward,bx.right)); 
points[0] = mx.MultiplyPoint3x4(quat * new Vector3(-bx.width/2,+bx.height/2,-bx.depth/2)+bx.center); 
...
points[7] = mx.MultiplyPoint3x4(quat * new Vector3(+bx.width/2,-bx.height/2,+bx.depth/2)+bx.center);

hi@rutter,我的盒子是定制的,我无法从渲染器或碰撞器获得它。我的基本要求是在8点的计算中包含右旋和前向向量,如图所示。我无法使用您的
BoxRegion
类提供答案,因为您没有详细描述它。正如我所说的:如果您理解数学,请使用enough、 你可以将其应用到你正在使用的其他类中。这是我在过去两天中一直尝试实现的长方体区域类的链接,并尝试了一些不正确的方法。您好,我实现了此解决方案,但仍然有一些长方体区域在应用旋转时没有正确定位。请原谅se find attached image,在图像中,黄色框是旋转的,但8个角点有不同的位置尝试翻转串联,即tr.rotation=qbox*tr.rotationhmm好的,说实话,我自己从来没有使用过unity,但我处理过框变换,我明白了你的问题。似乎有报道说SetLookRotation被窃听了如果你有全部3个向量,你也可以通过将它们设置为列(或行,不确定它在统一中如何工作)来构建旋转矩阵。看起来列0=x=right,1=y=up,2=z=forward。最后一列应该是“identity”(0,0,0,1)然后这个矩阵应该和全局矩阵矩阵相乘连接起来,这会让事情变得更糟,现在角点和游戏对象的位置之间有对数距离。