Вращение камеры вокруг оси Y мира (при 0 (0,0,0))
Я пытаюсь повернуть камеру вокруг Y
ось мира, обозначенная в моем проекте 3D крестом.
То, чего я достиг, это вращение вокруг своей оси, что круто, но это не то, что я хотел.
Как этого добиться, используя кватернионы и некоторые математические, а не osg::PositionAttitudeTransforms
или любая простая в использовании, но сложная для понимания инфраструктура.
Я хотел бы познакомиться с математикой за этим.
Соответствующий кусок кода
osg::Matrixd camM;
std::stringstream oss;
osg::Quat x_rot_q(osg::DegreesToRadians(-DEG), osg::Vec3d(1.0, 0.0, 0.0));
osg::Quat y_rot_q(osg::DegreesToRadians(DEG), osg::Vec3d(0.0, 1.0, 0.0));
camM = cameraManipulator->getMatrix();
camM.makeRotate(x_rot_q * y_rot_q);
camM.setTrans(250.0, 300.0, 250.0);
cameraManipulator->setByMatrix(camM);
osg::Quat y_delta_trans(osg::DegreesToRadians(DEG_DELTA), osg::Vec3d(0.0, 1.0, 0.0));
while(!viewer.done()) {
oss.str(std::string());
oss.clear();
camM = cameraManipulator->getMatrix();
camM.makeRotate(camM.getRotate() * y_delta_trans);
camM.setTrans(250.0, 300.0, 250.0);
cameraManipulator->setByMatrix(camM);
oss << getMatrixRepresentation(camM);
hudGeode->setStatus(oss.str());
viewer.frame();
}
который вы можете найти в нижней части файла Simple.cpp
, Весь проект можно найти в этой редакции в гист.
В окне GNU/Linux просто введите make
и он должен работать из коробки с установленными надлежащими инструментами.
1 ответ
Поворот камеры вокруг другой оси, чем ее собственная, довольно прост, просто выполните эти шаги по порядку:
- Переведите камеру на происхождение вашего мира
- если камера находится в точке (Xc,Yc,Zc) относительно мирового происхождения, что подразумевает перевод (-Xc,-Yc,-Zc).
- Поверните камеру так, как вы хотите, чтобы она вращалась
- Отменить предыдущий перевод, т.е. выполнить перевод (Xc,Yc,Zc)
Или математически как матричный продукт:
[ 1 0 0 -Xc ] [ 1 0 0 Xc ]
Transformation Matrix = [ 0 1 0 -Yc ] Rotation Matrix [ 0 1 0 Yc ]
[ 0 0 1 -Zc ] [ 0 0 1 Zc ]
[ 0 0 0 1 ] [ 0 0 0 1 ]
Редактировать:
Обратите внимание, что это общий способ вращения объекта вокруг источника, а не его собственного.