Текущие координаты объекта в OpenGL

Мне нужно выполнить статическое обнаружение столкновений между двумя объектами, используя C ++ / OpenGL. Я написал код для обнаружения столкновений, но этот код использует вершины двух моделей, как указано в их файлах .obj, а не координаты их текущих позиций (что я и хочу).

Я выполнил для обеих моделей преобразование «Перевод» и «Масштаб», и мне нужно знать, каковы эти координаты прямо сейчас. Я предполагаю, что это как-то связано с матрицами преобразования и т. Д., Но как это сочетается с начальными координатами?

Может кто-нибудь мне помочь?

1

Решение

Если у вас есть только перевод t и масштабирование s, вы можете просто рассчитать фактические позиции с помощью:

world_position = s * model_position + t

Если у вас есть произвольное преобразование, заданное как матрица M, вы вычисляете позицию с помощью:

world_position = M * model_position
//where model_position should be a 4d vector with w-coordinate 1
1

Другие решения

OpenGL не знает, что такое модель или сцена, он просто рисует точки, линии и треугольники в пиксельном кадровом буфере.

Пришло время отказаться от некоторых или всех конвейеров с фиксированными функциями. Вам больше не нужно строить матрицу вида модели, используя glRotate, glTranslate и glScale. Вместо этого вы должны поддерживать матрицу самостоятельно, используя некоторые математические библиотеки, такие как GLM или Eigen. Это дает вам один экземпляр матрицы преобразования модели, который можно применить к исходным координатам модели для тестирования столкновений, но также можно загрузить в матрицу просмотра модели с помощью glLoadMatrix (если вы также применили преобразование представления) или glMultMatrix в GL_MODELVIEW. матричный режим. Или вы идете за шейдерами и использовать форму.

2

Я рекомендую сначала нарисовать ваши объекты с их центроидом в начале координат (0, 0, 0)

Поэтому, когда вы вызываете функцию

GLfloat matrixMV [16];

glGetFloatv (GL_MODELVIEW_MATRIX, matrixMV);

координаты x, y, z

будет соответственно матрица MV [12] матрица MV [13] матрица MV [14]

  glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glRotatef(-25.0, 0.0, 1.0, 0.0);
glTranslatef(100.0, 50.0, 0.0);
/*Draw a triangle with centroid in the orign*/
glBegin(GL_POLYGON);

glVertex2f(0.0 , 1.0  );
glVertex2f(-1.0,-0.27 );
glVertex2f(1.0 ,-0.27 );

glEnd();

GLfloat matrixMV[16];
glGetFloatv(GL_MODELVIEW_MATRIX, matrixMV);double xCenterTriangle = matrixMV[12];
double yCenterTriangle = matrixMV[13];
double zCenterTriangle = matrixMV[14];
1

На самом деле вам нужно выполнить те же преобразования, что и с вашими координатами.

Если вы используете фиксированную функцию pipline, вы можете просто получить текущую матрицу ModelView, прежде чем начать рисовать один объект с помощью glGetFloatv(GL_MODELVIEW_MATRIX, m) в некоторые GLfloat m[16] и сохраните матрицы, чтобы позже применить их к вашим объектам.

Чтобы получить правильное умножение, вот способ упорядочения матричных элементов при умножении слева.

   | m[0] m[4]  m[8] m[12] |     v[0]
| m[1] m[5]  m[9] m[13] | x   v[1]
| m[2] m[6] m[10] m[14] |     v[2]
| m[3] m[7] m[11] m[15] |     v[3]
0
По вопросам рекламы [email protected]