Vector 围绕特定点旋转D3DX矢量3 这可能是一件很简单的事情,但是我对直接X的了解并没有达到我想要达到的水平。

Vector 围绕特定点旋转D3DX矢量3 这可能是一件很简单的事情,但是我对直接X的了解并没有达到我想要达到的水平。,vector,matrix,direct3d,directx-10,rotational-matrices,Vector,Matrix,Direct3d,Directx 10,Rotational Matrices,目前,我正在尝试创建一种在地形上移动的车辆。我试图通过在车辆周围创建一个正方形(4个D3DXVECTOR3点)使车辆识别地形,每个点检测地形高度并相应调整车辆 车辆是从Microsoft示例代码派生的简单对象。它有一个世界矩阵、坐标、旋转等 我试图实现的是使这些点随着车辆移动,在车辆移动时转向,以便它们能够检测到高度差异。这需要我在每次车辆移动时更新这些点,但我一辈子都不知道如何让它们正确旋转 总之,我正在寻找一种简单的方法来围绕原点(我的车辆坐标)旋转向量 这些点位于车轮附近,因此,如果它起作

目前,我正在尝试创建一种在地形上移动的车辆。我试图通过在车辆周围创建一个正方形(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个write,剩下的就只是复制粘贴了

无论我尝试什么,点要么不移动,要么在离开地图的情况下失去控制

下面是我的对象类的一个片段

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

在不了解更多代码的情况下,我无法确切说明它的功能,但是,如果您知道车辆在世界坐标系中的航向角,则思考此问题的一个“简单”方法是以车辆中心位于原点的方式表示您的点,使用一个简单的工具,根据方向围绕车辆旋转,然后将车辆的中心添加到生成的坐标中

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

请记住,角x和角y是以相对于车辆的坐标表示的,而不是相对于世界的坐标。

如果不了解更多代码,我无法确切说明它的功能,但是,如果您知道车辆在世界坐标系中的航向角,思考此问题的一个“简单”方法是以车辆中心位于原点的方式表示您的点,使用简单的旋转工具根据航向绕车辆旋转,然后将车辆的中心添加到生成的坐标中

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

请记住,角x和角y是用相对于车辆的坐标表示的,而不是相对于世界的坐标。

事实证明,我需要做的是

  • 按来源翻译
  • 轮换
  • 按来源翻译
  • 我所做的是

  • 移到原点
  • 轮换
  • 按长度/宽度平移
  • 我觉得是一样的

        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;
    

    结果证明我需要做的是

  • 按来源翻译
  • 轮换
  • 按来源翻译
  • 我所做的是

  • 移到原点
  • 轮换
  • 按长度/宽度平移
  • 我觉得是一样的

        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;
    

    如果不知道你的矩阵是如何形成的,就不可能知道你在用这些代码做什么。你能多发一点关于如何计算这些矩阵的信息吗?此外,“BoxPoint”不会出现在您的代码中。我发布了一些目标代码,也许这会有所帮助。如果不知道矩阵是如何形成的,就不可能知道您实际在使用这些代码做什么。你能多发一点关于如何计算这些矩阵的信息吗?此外,“BoxPoint”没有出现在您的代码中。我发布了一些目标代码,也许这会有所帮助。您是否建议我表示相对于车辆的框坐标?我需要世界空间中的框坐标,否则我无法将其用于当前目的。我添加了一些关于车辆类别的信息,这很有帮助。是否可以使用D3DXVEC3TransfermCoord来执行此操作?根据我收集的信息,您需要一个相对于车辆保持固定的框。也就是说,在对象的局部空间中,坐标是固定的。要获取拐角的世界空间坐标,请将相对于车辆的坐标变换为世界空间。因此,可以使用适当的D3DXVec调用将长方体的局部坐标乘以世界变换。问题在于,例如,当车辆向前/向后倾斜时,您可能希望也可能不希望您的拐角向上/向下移动。这就是我提出上述方法的原因。嗯,这可以解释为什么当我尝试类似的方法时,盒子点不会留在车上。我用的是世界空间坐标。我再试试看,上面你用的是X和Y。记住,我所做的只是在地面上旋转物体。所以在y=0时绕y轴旋转。我试着通过将y改为z来适应这一点,但现在我的杯子在车上跳着奇怪的舞蹈。这可能会把旋转搞混。。你有没有可能解释一下我做错了什么?你是不是建议我代表相对于车辆的坐标箱?我需要世界空间中的框坐标,否则我无法将其用于当前目的。我添加了一些关于车辆类别的信息,这很有帮助。是否可以使用D3DXVEC3TransfermCoord来执行此操作?根据我收集的信息,您需要一个相对于车辆保持固定的框。也就是说,在对象的局部空间中,坐标是固定的。要获取拐角的世界空间坐标,请将相对于车辆的坐标变换为世界空间。因此,可以使用适当的D3DXVec调用将长方体的局部坐标乘以世界变换。问题是你是我