Возможно, вы испытываете Замок карданного подвеса ;это может произойти, если вы наклонитесь полностью вверх или вниз, чтобы ваш вектор взгляда стал параллельным вашему вектору вверх, и в этом случае рыскание будет таким же, как и при крене.
Это может быть недостатком построения поворотовпо частям через углы Эйлера.Вы можете посмотреть на кватернионы.(Обратите внимание, что вы не можете вращаться с углами Эйлера; они являются просто представлением для поворота (вам нужно преобразовать его в матрицу или квадраты), но то, как вы справляетесь с этим, очень похоже на «угол Эйлера»)
Сила умножения матриц заключается в том, что любая последовательность из нескольких вращений может быть представлена (и объединена) в виде одной матрицы вращения.Вам нужно сделать что-то вроде этого:
void Transformable::yaw(float angle)
{
float4x4 rot; // temp rotation matrix
float3 translate(&_transform._41); // save our translation
float3 up(&_transform._21); // y axis
// build the rotation matrix for rotation around y
MatrixRotationAxis(&rot, &up, angle);
// multiply our transform by the rotation matrix
// note that order of multiplication matters and depends on
// if your matrices are column-major or row-major
MatrixMultiply(&_transform, &_transform, &rot);
// write back our original translation
memcpy(&_transform._41, &translate, sizeof(float3));
// might want to reorthogonalise every now and then
// to make sure basis vectors are orthonormal
// or you will probably get matrix creep after a few operations
}
вместо попытки поворота одного базисного вектора за раз.В этом случае _transform
будет однородной матрицей 4x4, представляющей матрицу преобразования.(ротация и перевод).Подматрица вершины 3х3 - это просто базисные векторы пространства ориентации.