2015-06-13 6 views
1

В моем коде у меня есть кватернион, который используется для вращения камеры для плеера. Кажется, что вращение работает нормально, но мои направленные векторы для перемещения и поворота не вращаются правильно.Пользовательское C++ Quaternion Rotation не работает правильно

Quaternion Умножение:

Quaternion Quaternion::operator*(Vector3 other) const 
{ 

    float x_ = w * other.x + y * other.z - z * other.y; 
    float y_ = w * other.y + z * other.x - x * other.z; 
    float z_ = w * other.z + x * other.y - y * other.x; 
    float w_ = -x * other.x - y * other.y - z * other.z; 

    return Quaternion(x_, y_, z_, w_); 

} 

Quaternion Quaternion::operator*(Quaternion other) const 
{ 

    Vector4 r = other.getValues(); 

    float x_ = x * r.w + w * r.x + y * r.z - z * r.y; 
    float y_ = y * r.w + w * r.y + z * r.x - x * r.z; 
    float z_ = z * r.w + w * r.z + x * r.y - y * r.x; 
    float w_ = w * r.w - x * r.x - y * r.y - z * r.z; 

    return Quaternion(x_, y_, z_, w_); 

} 

сопряженная функция

Quaternion Quaternion::conjugate() const 
{ 

    return Quaternion(-x, -y, -z, w); 

} 

Вектор вращения:

void Vector3::rotate(Quaternion rotation) 
{ 

    Quaternion rotated = rotation * *this * rotation.conjugate(); 

    x = rotated.getValues().x; 
    y = rotated.getValues().y; 
    z = rotated.getValues().z; 

} 

Sample Направленная Vector:

Vector3 Quaternion::getRight() const 
{ 

    Vector3 right(1.0f, 0.0f, 0.0f); 
    right.rotate(*this); 

    return right; 

} 

Если я камера поворачивается ровно 90 градусов вокруг оси у, и я распечатать значения правого вектора, х 0,000796229, у = 0 и г есть - 1. В этом случае x должно быть 0 и z должно быть положительным 1.

Я просматривал код Google и других пользователей за последние несколько дней, пытаясь найти то, что я делаю неправильно, но я не могу найти что-то не так.

UPDATE:

я в конечном итоге решив просто включить GLM в мои математические классы и после некоторого изменения вещей, все работает как надо.

+1

Отступы всего вашего кода еще на 4 пробела облегчат чтение – rds504

+1

Можете ли вы привести пример (цифры!) О том, что происходит не так, т.е. ваш ввод, вывод и ожидаемый результат. –

+0

@ rds504 Хорошо, спасибо за отзыв, я обновил сообщение. –

ответ

0

В итоге я решил включить GLM в мои математические классы и после некоторой смены вещей все работает так, как должно.

2

В вашем вращении вектора заменить первую строку на

Quaternion rotated = rotation * Quaternion(this->x, this->y, this->z, 0) * 
    rotation.conjugate(); 

Объяснения: Кватернионные умножения не коммутативные, что означает, что Q * v не равно v * Q, с V будучи кватернион с ш = 0 ,

+0

Я поместил это в код, я ничего не меняю, у меня были такие же результаты.Я попытался изменить порядок этого умножения, и интересно было некоторые способы устранить проблему неправильного направления до такой степени, что временами они были как раз наоборот, но вызвали поворот на оси z, которая не должна была произойти. Спасибо за помощь в любом случае. –