2013-03-19 4 views
0

Это, наверное, довольно простая вещь, но мои знания о прямом x просто не соответствуют тому, чего я пытаюсь достичь.Вращение D3DXVECTOR3 вокруг определенной точки

На данный момент я пытаюсь создать транспортное средство, которое перемещается по местности. Я стараюсь, чтобы автомобиль распознал местность, создав квадрат (4 точки D3DXVECTOR3) вокруг транспортного средства, точки которого каждый определяют высоту местности и соответственно регулируют транспортное средство.

Транспортное средство представляет собой простой объект, полученный из кода образца Microsoft. Он имеет мировую матрицу, координаты, вращения и т. Д.

То, что я пытаюсь достичь, состоит в том, чтобы эти точки двигались вместе с транспортным средством, поворачиваясь, когда он делает это, чтобы они могли определить разницу в высоте. Это требует, чтобы я обновлял очки каждый раз, когда двигался автомобиль, но я не могу за всю жизнь понять, как заставить их правильно вращаться.

Итак, я ищу простой способ повернуть вектор о происхождении (мои координаты транспортных средств).

Эти пункты расположены рядом с колесами транспортного средства, поэтому, если они сработают, они останутся там независимо от поворота оси y.

Heres Что Ive судимое:

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 относится к вектору, который я пытаюсь повернуть. Автомобиль, конечно, является источником вращения Вращение Y - это количество, которое оно повернуло.

Это код для 1 из 4 векторов в этом квадрате, но я предполагаю, что, как только я получу 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); 
+1

Не зная, как формируются ваши матрицы, невозможно понять, что вы на самом деле делаете с этим кодом. Не могли бы вы еще немного рассказать о том, как вы вычисляете эти матрицы? Кроме того, «BoxPoint» не отображается в вашем коде. – Kaganar

+0

Я разместил часть кода объекта, возможно, это поможет. – Digid3vil

ответ

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 выражаются в координатах относительно транспортного средства - НЕ по отношению к миру.

+0

Вы предлагаете мне представлять координаты ящика относительно автомобиля? Мне нужны координаты ящика в мировом пространстве, или я не могу использовать его для его текущей цели. Я добавил некоторую информацию о классе автомобилей, что помогает. – Digid3vil

+0

Можно ли использовать D3DXVec3TransformCoord для этого? – Digid3vil

+0

Из того, что я собираю, вы хотите коробку, которая остается неподвижной относительно автомобиля. То есть в локальном пространстве объекта координаты фиксированы. Чтобы получить координаты мирового пространства углов, вы преобразуете координаты относительно транспортного средства в мировое пространство. Таким образом, вы можете умножить свои локальные координаты на поле путем преобразования мира с помощью соответствующего вызова D3DXVec. Проблема в том, что вы можете или не хотите, чтобы ваши углы двигались вверх/вниз, так как автомобиль наклоняется вперед/назад, например. Вот почему я предложил вышеупомянутый метод. – Kaganar

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; 

 Смежные вопросы

  • Нет связанных вопросов^_^