Луч выбора не имеет никакого отношения к матрице модели.Если объекты в вашей сцене движутся (то есть изменяются матрицы моделей), сам луч не будет двигаться.
Какой метод вы планируете использовать между предложенными в ссылке?GL_SELECTION, рендеринг с особым цветом, самодельные пересечения?
Я отредактирую этот ответ соответственно
РЕДАКТИРОВАТЬ: давайте перейдем к самодельному, а затем
Сначала вам нужно сгенерировать луч.Вы обычно хотите выразить это в мировом пространстве (то есть «мой луч начинается в том же положении, что и моя камера, и его каталог - (xyz)). У вас есть два способа сделать это, что довольно хорошо объяснено в faq openGL (Один способ создать луч выбора ... Другой метод ...). Просто скопируйте и вставьте код.
Если мышь находится в центре экрана, ваш луч должен быть направлен в сторонуТо же направление, что и у вашей камеры. Вы можете проверить это с помощью аргументов gluLookAt. * 1011 *
Теперь, что вы хотите сделать, так это пересечь ваш луч с треугольниками вашей сетки, но у вас есть проблема, потому что треугольники невыражается в той же системе, что и луч.
Итак, вы должны выразить луч в системе треугольника.
система треугольников: система моделей; система лучей: система мира. К счастью, выиметь матрицу для перехода от модели к миру (матрица модели - та, которую вы устанавливаете после glPushMatrix). Таким образом, обратная (ModelMatrix) - это матрица из мира в матрицу.
ray = Ray(cam_pos, dir);
foreach (mesh)
ModelMatrix = whatever you want
InverseModelMatrix = inverse(ModelMatrix)
rayInModelSpace = Ray(InverseModelMatrix x ray.pos, InverseModelMatrix x ray.dir)
Intersect(rayInModelSpace, mesh)
Ваш метод Intersect может выглядеть следующим образом:
foreach (triangle in mesh )
if ray.intersect(triangle) return true
код пересечения треугольника и луча можно найти на geometrytools.com
Это будет довольно медленно, но будет работать,Есть несколько способов улучшить предварительную производительность, но самый простой - это вычислить AABB каждой сетки и сначала пересечь луч с AABB.Нет пересечения с AABB => Нет пересечения с сеткой
Код можно найти и в геометрических инструментах.
Я буду отсутствовать несколько дней, так что удачи:)