|
|
« Предыдущая тема | Следующая тема » |
Опции темы | Опции просмотра |
|
|
|||||
Наведение мыши на 3д объект
Собственное есть 3д объект куб, как узнать наведен ли на него курсор мыши?
Добавлено через 3 минуты П.С. Самописный движок на stage3d
__________________
Я заклинаю вас действовать иначе. |
|
|||||
Регистрация: Mar 2006
Адрес: Ростов-на-Дону
Сообщений: 80
|
Можно получить координаты проекции каждого вертекса треугольника на экран. Потом перевести в координатную систему flash'a и посмотреть, попадает ли курсор мыши в треугольник.
vec3 = viewProjMatrix * vertex3D vec2.x = ( vec3.x + 1.0 ) / 2.0 * viewportWidth vec2.y = ( 1.0 - vec3.y ) / 2.0 * viewportHeight |
|
|||||
Вообще обычно делается немного по-другому, 2 фазы, широкая и узкая.
Широкая фаза - пускаем луч из точки наблюдения (координаты камеры) через экранную плоскость (как правило называется camera near plane). Ищем все "кубики" в пространстве, через которые этот луч проходит ("кубики" - это Axis Aligned Bounding Box объектов на сцене). Узкая фаза - для каждого объекта проверяем каждую его поверхность (один и более полигонов, образующие плоскость) на пересечение с нашим лучом. Как искать пересечение луча и полигона: 1) Определяем точку пересечения луча и плоскости, на которой лежит полигон 2) Определяем, лежит ли точка перечечения луча и плоскости внутри треугольника (полигона) Как оптимизировать широкую фазу: 1) Поделить все пространство на большие кубики (Quad Tree) 2) При перемещении объекта в пространстве записывать в каких кубиках он находится 3) При поиске пересечений с AABB объектов обходить только те элементы Quad Tree, с которыми пересекается наш луч Как оптимизировать узкую фазу: Как правило для физики и HitTesta на каждый объект делается отдельный Mesh, весьма упрощенно напоминающий целевой объект.
__________________
...вселенская грусть |
|
|||||
Мне вот этот способ нравится:
1) событие мыши, знаем позицию на экране 2) context3d.clear() 3) ставим ножницы context3d.setScissorRectangle(mouseX, mouseY, 1, 1) 4) собираем объекты которые по баунбоксу попадают 5) ставим шейдер, который из константы берет цвет меша (конечно с поддержкой alpha threshold, kil и пр) 6) рисуем все меши с разным цветом 7) делаем ридбек(context3d.drawToBitmapData) в текстурку 1x1 и смотрим что там за цвет на мобильных платформах ридбек можно делать минимально в 4x4 |
|
|||||
Flastar, а конкретнее про шейдер можно и примерчик желательно?
__________________
Я заклинаю вас действовать иначе. |
Часовой пояс GMT +4, время: 02:37. |
|
« Предыдущая тема | Следующая тема » |
|
|