I am working on collision system for my game that uses custom colliders. I used this to create bounding box for collisions.
I am getting problem for the boxes where right and forward values have been used to create box. Otherwise its working fine. Anybody has any idea how to include right and forward vectors in calculating 8 points for the cube.
Below is my code for calculating points:
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
}
Box is changing its position when i apply quaternion to transform
You'd need to concatenate the box's orientation (stored as Right and Forward) to the world transform. Something like this should probably work:
Vector3 fwd=bx.forward.normalized(), rt=br.right.normalized(), up=fwd.Cross(rt);
Quaternion qbox; qbox.SetLookRotation(fwd,up);
tr.rotation = tr.rotation*qbox;
(since Unity is annoyingly left-handed, you might have to fiddle with signs and the concatenation order a bit, or perhaps use rt instead of fwd in SetLookRotation)
Update: following a discussion in chat, this seems to be the final working version.
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);