Получение значений объекта после вызова rotatef c ++ - PullRequest
1 голос
/ 27 мая 2010

Мне нужно получить доступ к значениям X, Y объекта вершины после того, как Ive повернул его (с помощью glRotate3f). Как это возможно? Мне нужен em, чтобы решить проблему столкновения объектов, когда столкновения будут посылать объекты в направлении, связанном с углом на основе градусов поворота объектов.

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

Хорошо, я подошел поближе, чтобы найти способ. Предположим, что X и Y и градусы 0, 90, 180, 270. Я установил точку в качестве центра объекта, допустим, что X = 30, Y = 70, X_size равен 60, а Y_size равен 140.

Если я сделаю new_X = X cos (угол) - Y sen (угол) и new_Y = X sen (угол) + Y cos (угол), если тогда я добавлю или вычесть центр объекта X и Y в new_X и new_Y Я на самом деле добираюсь до новой точки, за исключением случаев, когда угол равен 180, где мне нужно было бы перейти с -new_X + X.

Это способ решить эту проблему?

Ответы [ 3 ]

1 голос
/ 27 мая 2010

Вы немного неправильно понимаете вещи.

Вы ничего не вращали, вызвав glRotatef. Когда вы вызываете glRotate, вы изменяете матрицу преобразования, данные объекта остаются неизменными. Когда вы визуализируете объект, данные вершин проходят через конвейер обработки вершин, умножаются на матрицу преобразования (каждый раз, когда вы визуализируете объект), и технически вы не можете получить результат вычислений обратно - потому что объект не был изменен.

Ну, если вы действительно этого хотите, вы можете попробовать использовать буферы обратной связи gl (см. GlFeedbackBuffer), но я не вижу причины для этого. Я думаю, что "Красная книга OpenGL" может иметь примеры буферов обратной связи, но я не уверен в этом. Буферы обратной связи МОГУТ обеспечить необходимую вам функциональность, но я на самом деле ими не пользуюсь, поэтому я в этом тоже не уверен.

Кроме того, перемещение большого количества данных назад и вперед между системной памятью и видеопамятью (когда ваш объект хранится в видеопамяти) приводит к снижению производительности, поэтому вы не должны этого делать, даже если можете.

Если вы хотите получить состояние объекта после поворота, вам придется умножить его вручную - используя матрицу объекта и сохранить копию в системной памяти. Поскольку OpenGL объединяет матрицу объектов с матрицей представления (когда вы вызываете glRotatef), вам необходимо отдельно хранить матрицу вращения.

Это способ решить эту проблему?

Может быть, только если вы работаете с 2D и визуализируете один или два треугольника.

Обычно, когда вы выполняете преобразования, вы строите комбинированную матрицу вращения / перевода, а затем умножаете данные, которые вам нужны, используя эту матрицу - это будет более эффективно, поскольку позволяет объединять несколько преобразований в одно. И если вы работаете с неграфическими трехмерными процедурами (обнаружение столкновений), вы сами выполняете умножение матриц / векторное преобразование в своем коде.

AFAIK OpenGL не предоставляет подпрограмм манипулирования матрицей (аналогично D3DXMatrixMultiply в D3DX), но их легко писать с нуля, и их можно брать из разных мест. И вы можете использовать матричные функции D3DX, если вы в отчаянии (матрицы D3D имеют одинаковую структуру памяти). Кроме того, если вы серьезно относитесь к работе с 3D, вам в конечном итоге придется изучать матрицы.

0 голосов
/ 27 мая 2010

Это звучит как то, что вы ищете, это gluProject. Вы задаете координаты x, y и z объекта, текущие матрицы (представление модели и проекция) и координаты области просмотра, и она возвращает координаты x, y, в которые эти точки будут отображаться этими матрицами. Связанная документация включает формулы для работы, если вы предпочитаете делать это самостоятельно.

0 голосов
/ 27 мая 2010

Не напрямую, вы можете получить матрицу вида модели, используя float modelview [16]; glGetFloatv (GL_MODELVIEW, просмотр модели) и умножение матриц вручную между вашими векторами и матрицей просмотра модели.

В GL нет другого способа сделать это.

...