これはおそらく非常に単純なことですが、Direct Xに関する私の知識は、私が達成しようとしていることと同等ではありません。
今のところ、私は地形を動き回る乗り物を作ろうとしています。車両の周囲に正方形(4 D3DXVECTOR3ポイント)を作成して、車両に地形を認識させようとしています。各ポイントは、地形の高さを検出し、それに応じて車両を調整します。
車両は、Microsoftのサンプルコードから派生した単純なオブジェクトです。ワールドマトリックス、座標、回転などがあります。
私が達成しようとしているのは、これらのポイントを車両と一緒に動かし、そのときに回転して、高さの違いを検出できるようにすることです。これには、車両が移動するたびにポイントを更新する必要がありますが、ポイントを適切に回転させる方法を一生理解することはできません。
要約すると、原点(私の車両の座標)を中心にベクトルを回転させる簡単な方法を探しています。
これらのポイントは車両の車輪の近くにあるため、機能した場合は、車両のy軸の回転に関係なくそこに留まります。
これが私が試したことです:
D3DXVECTOR3 vec;
D3DXVec3TransformCoord(&vectorToHoldTransformation,&SquareTopLeftPoint,&matRotationY);
SquareTopLeftPoint = vec;
その結果、ポイントが狂ったように回転して制御不能になり、マップを離れました。
xRot = VehicleCoordinateX + cos(RotationY) * (SquareTopleftX - VehicleCoordinateX) - sin(RotationY) * (SquareTopleftZ - VehicleCoordinateZ);
yRot = VehicleCoordinateZ + sin(RotationY) * (SquareTopleftX - VehicleCoodinateX) + cos(RotationY) * (SquareToplefteZ - VehicleCoordinateZ);
BoxPointは、回転しようとしているベクトルを指します。車両はもちろん回転の原点です。RotationYは回転した量です。
これは、この正方形の4つのベクトルのうちの1つのコードですが、1つの書き込みを取得すると、残りはコピーアンドペーストであると想定します。
私が何を試しても、ポイントが動かないか、マップを完全に離れたままスパイラルが制御不能になります。
これが私のオブジェクトクラスのスニペットです
class Something
{
public:
float x, y, z;
float speed;
float rx, ry, rz;
float sx, sy, sz;
float width;
float length;
float frameTime;
D3DXVECTOR3 initVecDir;
D3DXVECTOR3 currentVecDir;
D3DXMATRIX matAllRotations;
D3DXMATRIX matRotateX;
D3DXMATRIX matRotateY;
D3DXMATRIX matRotateZ;
D3DXMATRIX matTranslate;
D3DXMATRIX matWorld;
D3DXMATRIX matView;
D3DXMATRIX matProjection;
D3DXMATRIX matWorldViewProjection;
//these points represent a box that is used for collision with terrain.
D3DXVECTOR3 frontLeftBoxPoint;
D3DXVECTOR3 frontRightBoxPoint;
D3DXVECTOR3 backLeftBoxPoint;
D3DXVECTOR3 backRightBoxPoint;
}
D3DXVec3TransformCoordを使用してこれを行うことが可能かもしれないと思っていました
D3DXMatrixTranslation(&matTranslate, origin.x,0,origin.z);
D3DXMatrixRotationY(&matRotateY, ry);
D3DXMatrixTranslation(&matTranslate2,width,0,-length);
matAllRotations = matTranslate * matRotateY * matTranslate2;
D3DXVECTOR3 newCoords;
D3DXVECTOR3 oldCoords = D3DXVECTOR3(x,y,z);
D3DXVec3TransformCoord(&newCoords, &oldCoords, &matAllRotations);