我在这里有点问题,我需要一些帮助。我正在尝试找到一种旋转方式,使我可以使物体跟随玩家(始终面对它)。我第一次尝试做叉积,点和旋转,但这不能正常工作。然后我开始将它分解为两个旋转(偏航和俯仰)和锁定滚动。它现在可以工作,但仅适用于某些方向(我相信四分之一圈,但可能更少)。这是我当前的代码:
XMVECTOR newDir = Vec3DtoDX((Player->Position - InternalEntity->Position).getNormalized());
XMVECTOR orig = XMVectorSet(0,0,1,0);
XMVECTOR xNewDir,xOrigDir,yNewDir,yOrigDir;
xOrigDir = XMVectorSet(0,1,0,0); // (y,z)
yOrigDir = XMVectorSet(0,1,0,0); // (x,z)
xNewDir = XMVectorSet(newDir.m128_f32[1],newDir.m128_f32[2],0,0);
yNewDir = XMVectorSet(newDir.m128_f32[0],newDir.m128_f32[2],0,0);
float xAngle = XMVector2AngleBetweenVectors(xNewDir,xOrigDir).m128_f32[0];
float yAngle = XMVector2AngleBetweenVectors(yNewDir,yOrigDir).m128_f32[0];
XMVECTOR rotDX = XMQuaternionRotationRollPitchYaw(xAngle,yAngle,0);
PxQuat rot = VecDXto4D<PxQuat>(rotDX);
这里工作正常,如果我面对靠近 Z 轴的物体 http://imgur.com/oNNNRXo
如果我移动更多,它会变成这样:http: //imgur.com/xFIEzdg
任何帮助将不胜感激。
编辑:我已经尝试从十字创建四元数,从点的 acos 创建角度。事实上,这是我的第一次。问题是它不能正常工作。这是我的做法:
PxVec3 newDir = (Player->Position - InternalEntity->Position).getNormalized();
PxVec3 orig(0,0,1);
PxVec3 axis = newDir.cross(orig);
float angle = XMVector3AngleBetweenVectors(Vec3DtoDX(newDir),Vec3DtoDX(orig)).m128_f32[0];
PxQuat rot(angle,axis);
其中 XMVector3AngleBetweenVectors 是:
XMVECTOR L1 = XMVector3ReciprocalLength(V1);
XMVECTOR L2 = XMVector3ReciprocalLength(V2);
XMVECTOR Dot = XMVector3Dot(V1, V2);
L1 = XMVectorMultiply(L1, L2);
XMVECTOR CosAngle = XMVectorMultiply(Dot, L1);
CosAngle = XMVectorClamp(CosAngle, g_XMNegativeOne.v, g_XMOne.v);
return XMVectorACos(CosAngle);
这将导致以下屏幕: http: //imgur.com/vlMPAwG 和:http: //imgur.com/PEz1aMc
有什么帮助吗?