这可能是一件非常简单的事情,但我对直接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);
答案 0 :(得分:1)
原来我需要做的是
我在做什么
以为它是一样的。
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以相对于车辆的坐标表示 - 而不是相对于世界。