Выбор объекта в 3d пространстве

156
26 октября 2018, 07:10

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

Если вопрос не понятен, то повторяю, нужно знать способы, чтобы выбрать 3d модель в пространстве, ну можно и спрайт, а то я спрайт выбираю обычно по координатам, но может есть более технологичный способ. Если будут примеры кода, то пусть они будут на си или с++, мне так будет понятно.

Answer 1

Есть пара общепринятых вариантов:

  1. Выводить в невидимый буфер все объекты разными цветами, и для выбора объекта, читать пиксель из буфера, и смотреть какого он цвета. Спосов применяется и работает до сих пор, если у вас много разной сложной геометрии (к примеру, гора из 100 000 вилок). Не забудьте отключить антиалиасинг и убедитесь, что не идет смешивания цветов из-за него. В зависимости от типа и динамики сцены, рисовать в буфер можно только при изменении сцены, и только тот 1 пиксель, что лежит под курсором.

  2. Так называемый ray-picking - когда вы кастуете луч из под курсора в пространстве камеры и проверяете с каким ближайшим объектом он пересекается. Соответственно, гранулярность объектов и поиска пересечений вы задаете сами. Если сцена простая, то можете просто все треугольники всех моделей перебирать. Если чуть сложнее пары кубов и шарика, то для начала, можете все объекты обернуть в BB (Bounding Boxes), для упрощения грубого поиска и при попадании в BB уже проверять этот объект подробнее. Сами объекты можно так же поделить через Octree на фрагменты и искать пересечения с непосредственно треугольниками из каждого фрагмента.

Подход к типу и иерархии поиска объекта под курсором во многом диктуется типом сцены. То что лучше работает для RTS, не всегда подходит шутеру или CAD.

READ ALSO
Объясните, что значит string(1, char)

Объясните, что значит string(1, char)

Прохожу курс по с++ и там в рекомендуемом решении задачи написано:

153
простое наследование JAVA

простое наследование JAVA

Суть проста, есть два класса: Main и Field

173
Внесение информации в базу данных и вытягивание оной из неё же

Внесение информации в базу данных и вытягивание оной из неё же

Стоит задача: поднять сервер с бд, с несколькими таблицами, в которые юзеры будут заносить значенияВ дальнейшем эти значения нужно будет...

172