1

这可能是一件非常简单的事情,但我对直接 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 是指我试图旋转的向量。Vehicle当然是旋转的原点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

在不了解您的代码的情况下,我无法确切说明它的作用,但是如果您知道车辆在世界坐标中的航向角度,那么考虑这个问题的一种“简单”方法是以如下方式表示您的点车辆的中心在原点,使用简单的旋转矩阵根据航向围绕车辆旋转,然后将车辆的中心添加到结果坐标中。

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 回答