В Ogre3d я хочу установить ориентацию, задав вектор «нормальный» для вида камеры (как стрелка, указывающая мне в глаза) и угол, который поворачивает камеру (как наклон головы).
Я могу заставить его работать с этим трюком:
float angle = 10; /* tilt my head 10 degrees to right */
Vector3 vector(0, 0, 1); /* z axis pointing forward */
Vector3 target = camera->getPosition() + vector;
camera->lookAt(target);
camera->roll(Degree(angle));
Я не уверен, что это будет работать для каждого значения, и это кажется хакерским. Я ищу что-то более правильное, например, использование кватернионов и Ogre::Camera::setOrientation()
,
Этот пример не работает:
Quaternion orientation(Degree(angle), vector);
camera->setOrientation(orientation);
потому что камера поворачивается на angle
вместе vector
,
Вы можете легко преобразовать вектор и угол в кватернион, представляющий вращение для вас. Это хорошо известный осевой угол кватерниона. Я не знаю, какой класс Quaternion вы используете (вероятно, есть в Огре). Однако позвольте мне привести пример кода из класса Quaternion, который я написал:
Quaternion Quaternion::CreateFromAxisAngle(Vector3 axis, float angle) {
float half = angle * 0.5f;
float s = sin(half);
Quaternion result;
result.x = axis.x * s;
result.y = axis.y * s;
result.z = axis.z * s;
result.w = cos(half);
return result;
}
Других решений пока нет …