这可能是一件非常简单的事情,但我对直接 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);