Мне нужно вычислить матрицу вращения из вектора направления,
и вектор направления из матрицы вращения.
Направление вверх должно соответствовать оси 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, но это не так.
Что именно я должен сделать, чтобы получить нужные мне результаты?
Вопрос немного смущает меня. Используя вектор направления, вы можете определить бесконечные матрицы поворота, которые заставят камеру указывать / смотреть в этом направлении, если вы не определите некоторые дополнительные ограничения.
Я буду предполагать, основываясь на вашем коде, что вы хотите, чтобы вектор вверх был 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]
,
Других решений пока нет …