围绕特定点旋转D3DXVECTOR3

时间:2013-03-19 00:16:39

标签: vector matrix direct3d directx-10 rotational-matrices

这可能是一件非常简单的事情,但我对直接x的了解并不符合我想要实现的目标。

目前我正试图创造一种在地形上移动的车辆。我试图让车辆通过在车辆周围创建一个正方形(4个D3DXVECTOR3点)识别地形来识别地形,并相应地调整车辆。

车辆是源自Microsoft示例代码的简单对象。它有一个世界矩阵,坐标,旋转等。

我想要达到的目的是让这些点与车辆一起移动,当它转动时,它们可以检测到高度的差异。这要求我每次车辆移动时更新点数,但我不能为我的生活找出如何使它们正确旋转。

总而言之,我正在寻找一种简单的方法来围绕原点旋转矢量(我的车辆坐标)。

这些点位于车轮附近,所以如果它起作用,它们将留在那里,无论车辆y轴旋转。

Heres我曾经尝试过:

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);

2 个答案:

答案 0 :(得分:1)

原来我需要做的是

  1. 翻译-origin。
  2. 旋转
  3. 按来源翻译。
  4. 我在做什么

    1. 移至原点
    2. 旋转
    3. 按长度/宽度翻译
    4. 以为它是一样的。

          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;
      

答案 1 :(得分:0)

在不了解您的代码的情况下,我无法确切地知道它的作用,但是,如果您知道车辆在世界坐标中的航向角度,则可以通过一种“简单”的方式来考虑此问题。以车辆中心位于原点的方式,使用简单的rotation matrix根据航向将其围绕车辆旋转,然后将车辆的中心添加到生成的坐标中。

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以相对于车辆的坐标表示 - 而不是相对于世界。