Как я могу вычислить луч выбора с несколькими матрицами вида модели? - PullRequest
0 голосов
/ 12 сентября 2010

Я бы хотел вычислить пересечение между лучом и моделями, которые пользователь видит на экране моего приложения.Я следую Руководству OpenGL , но у меня есть много моделей в сцене, которые я рисую независимо и динамически в контекстном режиме, применяя перевод к текущей матрице вида модели (т.е. для каждой модели, которую я делаю

glPushMatrix,

glTranslatef,

draw the model,

glPopMatrix).

Нужно ли мне вычислять также разные лучи, по одному для каждого объекта (для проверки позже, если он пересекается с ограничивающей сферой модели)?

Может быть, не так понятна какая-то концепция выбора лучейя еще.Любая ссылка, руководство и т. Д. Будет высоко ценится ^^

1 Ответ

1 голос
/ 13 сентября 2010

Луч выбора не имеет никакого отношения к матрице модели.Если объекты в вашей сцене движутся (то есть изменяются матрицы моделей), сам луч не будет двигаться.

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

Код можно найти и в геометрических инструментах.

Я буду отсутствовать несколько дней, так что удачи:)

...