столкновение точка - плоскость без функций glutLookAt * - PullRequest
0 голосов
/ 04 сентября 2010

Как я понял, рекомендуется использовать glTranslate / glRotate в пользу glutLootAt.Я не собираюсь искать причины, выходящие за рамки очевидного режима вычисления HW против SW, а просто пойду с волной.Тем не менее, это вызывает у меня некоторые головные боли, поскольку я точно не знаю, как эффективно предотвратить пробивание камеры сквозь стены.Меня интересуют только пересечения в точечной плоскости, а не AABB или что-то еще.

Итак, использование glTranslates и glRotates означает, что точка обзора остается неподвижной (на уровне (0,0,0) для простоты), пока мир вращается вокруг нее.Для меня это означает, что для проверки любых точек пересечения мне необходимо пересчитать координаты мировых вершин (что не требовалось при подходе glutLookAt) для каждого движения камеры.Поскольку невозможно получить необходимые новые координаты из земли графического процессора, их нужно вычислять в земле процессора вручную.Для каждого движения камеры ...: (*

Кажется, что необходимо сохранять текущие повороты отдельно для каждой из трех осей и одинаковые для переводов. В моей программе не используется масштабирование. Мои вопросы:

1 - ошибочны ли приведенные выше рассуждения? Как? 2 - если нет, то должен быть способ избежать таких пересчетов. То, как я это вижу (и, глядя на http://www.glprogramming.com/red/appendixf.html), нужноодно матричное умножение для переводов и другое для вращения (только в сторону необходимой оси y). Однако необходимость вычислять так много сложений / умножений и особенно синуса / косинуса, безусловно, будет убивать FPS. Будут тысячи или даже десяткитысяч вершин для вычисления. Каждый кадр ... все математические ... После вычисления новых координат мира все кажется очень простым - просто посмотрите, есть ли какая-либо плоскость, которая изменила свой знак "d" (из уравнения плоскостей ax + by + cz + d = 0). Если это так, используйте подход облегченных кросс-произведений, чтобы проверить,Мазь находится внутри пространства внутри каждого «движущегося» треугольника этой плоскости.

Спасибо

изменить: я нашел о glGet, и я думаю, что это путь, но я не знаю, как правильно его использовать:

    // Retains the current modelview matrix
//glPushMatrix();
glGetFloatv(GL_MODELVIEW_MATRIX, m_vt16CurrentMatrixVerts);
//glPopMatrix();

m_vt16CurrentMatrixVertsэто float [16], который заполняется 0.f или 8.67453e-13 или чем-то подобным.Где я облажался?

1 Ответ

2 голосов
/ 10 сентября 2010

gluLookAt - очень удобная функция, абсолютно без потери производительности. Нет никаких оснований не использовать его, и, прежде всего, нет никаких соображений по этому поводу. Как заявил Mk12, glRotatef также выполняется на процессоре. Графическая часть: gl_Position = ProjectionMatrix x ViewMatrix x ModelMatrix x VertexPosition.

«использование glTranslates и glRotates означает, что точка обзора остается неподвижной» -> то же самое для gluLookAt

«при (0,0,0) для простоты» -> не для простоты, это факт. Однако это (0,0,0) находится в системе координат камеры. Это имеет смысл: относительно камеры камера находится в начале координат ...

Теперь, если вы хотите, чтобы камера не проходила сквозь стены, обычным способом является отслеживание луча от камеры. Я подозреваю, что это то, о чем вы говорите («проверить наличие точек пересечения»). Но нет необходимости делать это в пространстве камеры. Вы можете сделать это в мировом пространстве. Вот сравнение:

  • Отслеживание лучей в пространстве камеры: луч всегда начинается с (0,0,0) и идет до (0,0, -1). Геометрия должна быть преобразована из Пространства Модели в Пространство Мира, а затем в Пространство Камеры, что вас раздражает
  • Отслеживание лучей в мировом пространстве: луч начинается с положения камеры (в мировом пространстве) и переходит в (eyeCenter - eyePos) .normalize (). Геометрия должна быть преобразована из модельного пространства в мировое пространство.

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

  • Во-первых, мир вашей игры, вероятно, все еще: матрица моделей, вероятно, всегда идентична. Таким образом, преобразование его геометрии из Пространства Модели в Мир равносильно бездействию вообще.
  • Во-вторых, для всех других объектов вы можете использовать противоположный подход. Вместо того, чтобы преобразовать всю геометрию в одном направлении, измените только луч в обратном направлении: возьмите матрицу вашей модели, переверните ее, и вы получите матрицу, которая перемещается из мирового пространства в пространство модели. Умножьте источник и направление вашего луча на эту матрицу: ваш луч теперь находится в модельном пространстве. Пересекаются нормальным способом. Готово.

Обратите внимание, что все, что я сказал, это стандартные приемы. Никаких хаков или других странных вещей, только математика:)

...