Вращение камеры вокруг оси 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  ]

Редактировать:

Обратите внимание, что это общий способ вращения объекта вокруг источника, а не его собственного.

Другие вопросы по тегам