Мне нужно выполнить статическое обнаружение столкновений между двумя объектами, используя C ++ / OpenGL. Я написал код для обнаружения столкновений, но этот код использует вершины двух моделей, как указано в их файлах .obj, а не координаты их текущих позиций (что я и хочу).
Я выполнил для обеих моделей преобразование «Перевод» и «Масштаб», и мне нужно знать, каковы эти координаты прямо сейчас. Я предполагаю, что это как-то связано с матрицами преобразования и т. Д., Но как это сочетается с начальными координатами?
Может кто-нибудь мне помочь?
Если у вас есть только перевод 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
OpenGL не знает, что такое модель или сцена, он просто рисует точки, линии и треугольники в пиксельном кадровом буфере.
Пришло время отказаться от некоторых или всех конвейеров с фиксированными функциями. Вам больше не нужно строить матрицу вида модели, используя glRotate, glTranslate и glScale. Вместо этого вы должны поддерживать матрицу самостоятельно, используя некоторые математические библиотеки, такие как GLM или Eigen. Это дает вам один экземпляр матрицы преобразования модели, который можно применить к исходным координатам модели для тестирования столкновений, но также можно загрузить в матрицу просмотра модели с помощью glLoadMatrix (если вы также применили преобразование представления) или glMultMatrix в GL_MODELVIEW. матричный режим. Или вы идете за шейдерами и использовать форму.
Я рекомендую сначала нарисовать ваши объекты с их центроидом в начале координат (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];
На самом деле вам нужно выполнить те же преобразования, что и с вашими координатами.
Если вы используете фиксированную функцию 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]