Как определить самый верхний объект в 2-й проекции 3-го объекта? - PullRequest
3 голосов
/ 20 ноября 2010

У меня есть поверхность, на которой нарисован набор 3d объектов. Задача - определить объект по заданным координатам на поверхности.

Например: некоторые объекты нарисованы в настольном приложении, мне нужно определить, на каком объекте щелкнул пользователь.

Не могли бы вы посоветовать, как обычно решается такая задача? Мне нужно создать помнить самый верхний объект для каждого пикселя? Я не думаю, что это лучший подход.

Любые мысли приветствуются!

Спасибо!

Ответы [ 2 ]

2 голосов
/ 20 ноября 2010

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

  1. Приведение лучей : найдите линию, которая начинается в положении камеры и проходит через интересующую вас точку поверхности. (строка «под мышкой» или «под пальцем» для сенсорного экрана.) В зависимости от используемой 3D-системы, может быть вызов API для генерации этой строки: например, Camera.ViewportPointToRayв Unity3D, или вам, возможно, придется генерировать его самостоятельно, инвертируя преобразование камерыНайдите все точки пересечения между этой линией и объектами в вашей сцене.Какая из этих точек находится ближе всего к ближней плоскости камеры?Вы можете использовать разбиение пространства , чтобы ускорить это.

  2. Рендеринг : сделать дополнительный проход рендеринга, в котором вместо записи текстур вкадровый буфер, вы записываете, какие объекты были нарисованы.Вы не делаете проход рендеринга для всего экрана, вы просто делаете это для интересующей области (например, пикселя). (Это режим GL_SELECT в OpenGL: см. Руководство по комплектации для деталей.)

1 голос
/ 20 ноября 2010

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

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

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

...