Используя кватернион, если я поворачиваю свой куб вдоль оси на 90 градусов, я получаю другую сторону кубика переднего фронта, которая выглядит как прямой квадрат сплошного цвета. Мой куб имеет разные цветные стороны, поэтому изменение оси, с которой она вращается, дает мне эти разные цвета, как ожидалось.Почему мой куб искажен?
Когда я пытаюсь поворачиваются на произвольное количество, я получаю довольно эффектный беспорядок, и я не знаю, почему, так как я бы ожидать, что процесс кватернионов хорошо работать независимо от угла:
Я создаю кватернион из 2-х векторов с помощью этого:
inline QuaternionT<T> QuaternionT<T>::CreateFromVectors(const Vector3<T>& v0, const Vector3<T>& v1)
{
if (v0 == -v1)
return QuaternionT<T>::CreateFromAxisAngle(vec3(1, 0, 0), Pi);
Vector3<T> c = v0.Cross(v1);
T d = v0.Dot(v1);
T s = std::sqrt((1 + d) * 2);
QuaternionT<T> q;
q.x = c.x/s;
q.y = c.y/s;
q.z = c.z/s;
q.w = s/2.0f;
return q;
}
Я думаю, что выше метод хорошо, так как я видел много примеров кода правильно использовать его.
С описанным выше способом, я делаю это:
Quaternion quat1=Quaternion::CreateFromVectors(vec3(0,1,0), vec3(0,0,1));
Он работает, и это поворот на 90 градусов.
Но предположим, я хочу больше как поворот на 45 градусов?
Quaternion quat1=Quaternion::CreateFromVectors(vec3(0,1,0), vec3(0,1,1));
Это дает мне беспорядок наверху. Я также попытался нормализовать quat1
, который предоставляет разные, хотя и искаженные результаты.
Я использую кватернион в качестве матрицы вращения видовой, с помощью этого:
inline Matrix3<T> QuaternionT<T>::ToMatrix() const
{
const T s = 2;
T xs, ys, zs;
T wx, wy, wz;
T xx, xy, xz;
T yy, yz, zz;
xs = x * s; ys = y * s; zs = z * s;
wx = w * xs; wy = w * ys; wz = w * zs;
xx = x * xs; xy = x * ys; xz = x * zs;
yy = y * ys; yz = y * zs; zz = z * zs;
Matrix3<T> m;
m.x.x = 1 - (yy + zz); m.y.x = xy - wz; m.z.x = xz + wy;
m.x.y = xy + wz; m.y.y = 1 - (xx + zz); m.z.y = yz - wx;
m.x.z = xz - wy; m.y.z = yz + wx; m.z.z = 1 - (xx + yy);
return m;
}
Любой идеи, что здесь происходит?
Я думаю, что есть какая-то проблема с вашим тестированием глубины. Это может заплатить, чтобы проверить это! – SIGKILL
Не связано, я не думаю, но я не вижу, как это должно работать условие 'if (v0 == -v1)'. Если я хочу повернуть (1,0,0) на (-1,0,0), как можно вращать вокруг (1,0,0) правильную ориентацию? В этом отношении, как это может работать для любого вектора, который не перпендикулярен произвольной (1,0,0) оси? – JasonD
@JasonD хороший вопрос. Это не моя векторная библиотека, а широко используемая. – johnbakers