1

これはおそらく非常に単純なことですが、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);
4

2 に答える 2

1

私がする必要があるのは

  1. -origin で翻訳します。
  2. 回転する
  3. 起源で翻訳します。

私がしていたのは

  1. 原点に移動
  2. 回転する
  3. 長さ/幅で翻訳

それは同じだと思った。

    D3DXMATRIX matTranslate2;
D3DXMatrixTranslation(&matTranslate,-origin.x,0,-origin.z);
D3DXMatrixRotationY(&matRotateY,ry);
D3DXMatrixTranslation(&matTranslate2,origin.x,0,origin.z);
//D3DXMatrixRotationAxis(&matRotateAxis,&origin,ry);

D3DXMATRIX matAll = matTranslate * matRotateY * matTranslate2;

D3DXVECTOR4 newCoords;
D3DXVECTOR4 oldCoords = D3DXVECTOR4(x,y,z,1);

D3DXVec4Transform(&newCoords,&oldCoords,&matAll);
//D3DXVec4TransformCoord(&newCoords, &oldCoords, &matAll);

return newCoords;
于 2013-03-19T21:32:59.227 に答える
0

コードについて詳しく知らないと、それが正確に何をするのかはわかりませんが、世界座標での車両の進行方向の角度がわかっている場合、この問題について考える「簡単な」方法の 1 つは、次のような方法でポイントを表すことです。車両の中心が原点にあることを確認し、単純な回転行列を使用して、見出しに従って車両を中心に回転させ、結果の座標に車両の中心を追加します。

x = vehicle_center_x + cos(heading) * corner_x - sin(heading) * corner_y
y = vehicle_center_y - sin(heading) * corner_x + cos(heading) * corner_y

corner_x と corner_y は、ワールドに対する相対座標ではなく、車両に対する相対座標で表されることに注意してください。

于 2013-03-19T00:31:49.977 に答える