У меня проблема.
У меня есть проект OpenGl, и я хочу установить матрицу камеры OpenGl в камеру OpenSceneGraph, чтобы иметь тот же вид.
У меня есть этот код для получения камеры OpenGl:
GLdouble camera_pos[3];
double rationZoom = // RatioZoom
int* iViewport = // the ViewPort
double* projetMatrix = // Projection Matrix
double* modelMatrix = // ModelView matrix
// screenCenter is the position of my model.
double screenCenterX = // The center in x Axis
double screenCenterY = // The center in y Axis
gluUnProject((iViewport[2] - iViewport[0]) / 2, (iViewport[3] - iViewport[1]) / 2,
0.0, modelMatrix, projetMatrix, iViewport, &camera_pos[0], &camera_pos[1], &camera_pos[2]);`
//Camera_pos is the position X,Y,Z of my camera.
И в OpenSceneGraph я делаю этот код, чтобы установить камеру с глазом/центром/вверх на LookAt камеры (чтобы иметь тот же вид, что и OpenGl):
// i use a zoom ration to have the same distance.
double X = ((camera_pos[0]/2) - ((screenCenterX)))/rationZoom;
double Y = ((camera_pos[1]/2) - ((screenCenterY)))/rationZoom;
double Z = ((camera_pos[2]/2)) / rationZoom;
osg::Vec3 updateCameraPosition(X, Y, Z);
osg::Matrix matrixCameraPosition;
matrixCameraPosition.setTrans(updateCameraPosition);
// Yes, for the center i invert the position matrix of the camera
osg::Matrix matrixCameraCenter;
matrixCameraCenter.invert(matrixCameraPosition);
osg::Vec3f eye(matrixCameraPosition.getTrans());
osg::Vec3f up(0, 0, 1);
osg::Vec3f centre = osg::Vec3f(matrixCameraCenter.getTrans().x(),
matrixCameraCenter.getTrans().y(),
matrixCameraCenter.getTrans().z());
// And a set the view into the camera
nodeCamera->setViewMatrixAsLookAt(eye, centre, up);
Для инициализации позиции у меня нет проблем, но если я панорамирую модель проекта OpenGl, у меня нет такого же представления.
Если я не ошибаюсь, для OpenGl система координат: X-влево, Y-вверх и Z-назад, а для OpenSceneGraph это: X-влево, Y-назад, Z-вверх.
Может быть, это проблема, и я должен установить Y вместо Z в OpenSceneGraph?
ДА ИЗВИНИТЕ, моя ошибка, это Z- назад не правильно извините. В OpenSceneGraph по умолчанию назад — Y, а вверх — Z, но когда я пытаюсь изменить координаты системы, чтобы иметь те же оси, что и в OpenGL, камера поворачивается на 90 градусов.
Я решил свою проблему.
Мне не нужно вычислять камеру или устанавливать setViewMatrixAsLookAt, а просто получить матрицу представления модели и матрицу проекции OpenGl и установить камеру OpenScenGraph, например:
double* projetMatrix = // the Projection matrix
double* modelMatrix = // The modelView matrix
osg::Matrixd modelViewMatrix(modelMatrix[0], modelMatrix[1], modelMatrix[2], modelMatrix[3],
modelMatrix[4], modelMatrix[5], modelMatrix[6], modelMatrix[7],
modelMatrix[8], modelMatrix[9], modelMatrix[10], modelMatrix[11],
modelMatrix[12], modelMatrix[13], modelMatrix[14], modelMatrix[15]
);
osg::Matrixd projectionMatrix(projetMatrix[0], projetMatrix[1], projetMatrix[2], projetMatrix[3],
projetMatrix[4], projetMatrix[5], projetMatrix[6], projetMatrix[7],
projetMatrix[8], projetMatrix[9], projetMatrix[10], projetMatrix[11],
projetMatrix[12], projetMatrix[13], projetMatrix[14], projetMatrix[15]
);
И :
camera->setViewMatrix(modelViewMatrix);
camera->setProjectionMatrix(projectionMatrix);
camera->setViewport(new osg::Viewport(iViewport[0], iViewport[1], iViewport[2], iViewport[3]));
"X-слева, Y-сверху и Z-справа" что это вообще значит? как X и Z могут указывать в противоположных направлениях? относительно камеры OpenGL имеет X-вправо, Y-вверх, Z-назад; относительно мира вы можете настроить его как угодно, и я придерживаюсь X-восток, Y-север, Z-вверх. Я не знаю об OpenSceneGraph.