私はここでちょっとした問題を抱えていて、助けてもらいたいのです。オブジェクトをプレーヤーに追従させることができる回転を見つけようとしています(常に直面しています)。私は最初に外積、ドット、回転を試みましたが、それは正しく機能しません。次に、それを 2 つの回転 (ヨーとピッチ) とロックアウト ロールに分解しました。現在は機能していますが、一部の方向に対してのみです (円の 4 分の 1 を信じていますが、それよりも小さい可能性があります)。これは私の現在のコードです:
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 And : http://imgur.com/PEz1aMc
何か助けはありますか?