Как я понял, рекомендуется использовать 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 или чем-то подобным.Где я облажался?