Матрица камеры для камеры OpenSceneGraph

У меня проблема.

У меня есть проект 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?

"X-слева, Y-сверху и Z-справа" что это вообще значит? как X и Z могут указывать в противоположных направлениях? относительно камеры OpenGL имеет X-вправо, Y-вверх, Z-назад; относительно мира вы можете настроить его как угодно, и я придерживаюсь X-восток, Y-север, Z-вверх. Я не знаю об OpenSceneGraph.

Yakov Galka 21.01.2023 00:15

ДА ИЗВИНИТЕ, моя ошибка, это Z- назад не правильно извините. В OpenSceneGraph по умолчанию назад — Y, а вверх — Z, но когда я пытаюсь изменить координаты системы, чтобы иметь те же оси, что и в OpenGL, камера поворачивается на 90 градусов.

Dada 21.01.2023 15:30
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
2
71
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я решил свою проблему.

Мне не нужно вычислять камеру или устанавливать 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]));

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