2013-03-12 2 views
1

Используя кватернион, если я поворачиваю свой куб вдоль оси на 90 градусов, я получаю другую сторону кубика переднего фронта, которая выглядит как прямой квадрат сплошного цвета. Мой куб имеет разные цветные стороны, поэтому изменение оси, с которой она вращается, дает мне эти разные цвета, как ожидалось.Почему мой куб искажен?

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

enter image description here

Я создаю кватернион из 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; 
} 

Любой идеи, что здесь происходит?

+0

Я думаю, что есть какая-то проблема с вашим тестированием глубины. Это может заплатить, чтобы проверить это! – SIGKILL

+0

Не связано, я не думаю, но я не вижу, как это должно работать условие 'if (v0 == -v1)'. Если я хочу повернуть (1,0,0) на (-1,0,0), как можно вращать вокруг (1,0,0) правильную ориентацию? В этом отношении, как это может работать для любого вектора, который не перпендикулярен произвольной (1,0,0) оси? – JasonD

+0

@JasonD хороший вопрос. Это не моя векторная библиотека, а широко используемая. – johnbakers

ответ

0

Как выглядит ваша усечка? Если у вас есть искаженный «объектив», например, поле зрения с широким углом обзора, то углы, которые на самом деле показывают глубину, например произвольное вращение, могут выглядеть не так, как вы ожидаете. (Точно так же, как объектив fisheye на камере делает перспективный взгляд нереальным).

Убедитесь, что вы используете реалистичную усечку, если хотите увидеть реалистичные изображения.

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