Матрица вращения Direct3D от Vector и наоборот

Мне нужно вычислить матрицу вращения из вектора направления,
и вектор направления из матрицы вращения.

Направление вверх должно соответствовать оси Z,
вперед у, а справа х;

    D3DXMATRIX m; // the rotation matrix
D3DXVECTOR3 v; // this is the direction vector wich is given
D3DXVECTOR3 r; // resulting direction vector

float len = D3DXVec3Length(&v); // length of the initial direction vector

// compute matrix
D3DXMatrixLookAtLH(&m, &v, &D3DXVECTOR3(0,0,0), &D3DXVECTOR3(0,0,1));

// use the matrix on a vector { 0, len, 0 }
D3DXVec3TransformCoord(&r, &D3DXVECTOR3(0,len,0), &m);

Теперь вектор р должно быть равно v, но это не так.
Что именно я должен сделать, чтобы получить нужные мне результаты?

0

Решение

Вопрос немного смущает меня. Используя вектор направления, вы можете определить бесконечные матрицы поворота, которые заставят камеру указывать / смотреть в этом направлении, если вы не определите некоторые дополнительные ограничения.
Я буду предполагать, основываясь на вашем коде, что вы хотите, чтобы вектор вверх был Z 🙂

Во-первых, будьте осторожны: кажется, что вы описываете правую систему координат, но используете левую функцию D3DXMatrixLookAtLH,
Во-вторых, ссылка на эту функцию говорит о том, что:

D3DXMATRIX* D3DXMatrixLookAtLH(
_Inout_  D3DXMATRIX *pOut,
_In_     const D3DXVECTOR3 *pEye,
_In_     const D3DXVECTOR3 *pAt,
_In_     const D3DXVECTOR3 *pUp
);

Вы создаете матрицу проверки, определяющую, что:

  • Камера расположена в конце v вектор,
  • Камера смотрит в сторону [0 0 0]

Вы уверены, что это правильно, или вы искали противоположное?

В-третьих, вы применяете матрицу вращения к масштабированному Y базисный вектор [0 length 0], Если вы хотите, чтобы повернутый вектор был vЯ думаю, вы должны применить его к масштабированным X базисный вектор вместо [len 0 0],

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]