В моем коде у меня есть кватернион, который используется для вращения камеры для плеера. Кажется, что вращение работает нормально, но мои направленные векторы для перемещения и поворота не вращаются правильно.Пользовательское 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 в мои математические классы и после некоторого изменения вещей, все работает как надо.
Отступы всего вашего кода еще на 4 пробела облегчат чтение – rds504
Можете ли вы привести пример (цифры!) О том, что происходит не так, т.е. ваш ввод, вывод и ожидаемый результат. –
@ rds504 Хорошо, спасибо за отзыв, я обновил сообщение. –