20 Мая 2024, 06:13:18
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.

Навигация по форуму







guest3d
Quest3D - Русскоязычное сообщество > Quest3D > Программирование > ColladaImport и DetecMouseCollision
ColladaImport и DetecMouseCollision
(Прочитано 16000 раз)
  1 [2]
Печать
Sqwer | ***** | Ветеран | Сообщений: 540 | «Ответ #15 28 Октября 2010, 21:59:30 »
Re: ColladaImport и DetecMouseCollision |
15
Цитировать
Вообще, пользоваться матрицами не самый лучший способ.
Представь, что в одной точке находится огромный шар и маленький куб.
А еще лучше, длиииииный параллелепипед и сфера. Матрицы - одинаковые. А конец параллелепипеда к нам ближе. )


2) делать рендер в текстуру, и по ней  определять, цвет(тексель) какого объекта находится под  указателем курсора. (потяжелее)
не составит труда для знатоков С++ и DirectX  Подмигивающий
DimiS | **** | Старожил | Сообщений: 284 | «Ответ #16 31 Октября 2010, 03:02:27 »
Re: ColladaImport и DetecMouseCollision |
16
ппц, чёто вы перемудрили с баундбоксами
всё решается с помощью обычного коллижен рей чека, есть куча экзамплов, например
\Examples\Advanced\Pick mesh with mouse.cgr
Sqwer | ***** | Ветеран | Сообщений: 540 | «Ответ #17 31 Октября 2010, 03:30:37 »
Re: ColladaImport и DetecMouseCollision |
17
Сам алгоритм нахождения пересечения луча с мешем очень тяжёл (дефалтный метод в ДХ9,  в ДХ10 и ДХ11   метод занесли в D3DX )  , при его выполнении проходит выборка  из всех треугольников.
само сабой   понятно, что быстродействия никакого.

Поэтому  придуман  подход к сокращению вычислений.


первый тест на пересечение производится  по ААББ или сфере ( пересечение находится простеньким алгоритмом, который в разы  быстрее  перебора каждого треугольника модели)

после этого теста   у нас  есть список  объектов, которые прошли тест (их ААББ или сфера   пересеклась с лучём)

далее можно идти по 2 путям:

1)  из списка произвести  тест пересечения уже по реальной геометрии

2)  каждому объекту  присваиваем уникальный цвет и рендим его  в текстуру  по вектору луча, FOV узкий около 20*20 (получаем текстурку маленького разрешения 32*32 например) смотрим  на цвет пикселя, что в середине , и сравниваем этот цвет с цветом объектов. (особой чертой похода является возможность смотреть, через прозрачные полигоны!!! например дерево рендися билбордом,  и надо выбрать объект  что за ним... по первому пути  мы никак его не выберим если объект целиком спрятан за билборд дерева, а по второму пути есть шанс  выбрать его  через листву). Недостаток в том, что метод тяжёл в реализации.



Если выборка идёт из  малополигональных объектов или количество объектов мало, то  нужно последовать совету Димиса. 



« Последнее редактирование: 31 Октября 2010, 04:07:50 от Sqwer »
Ruslan | ***** | Ветеран | Сообщений: 664 | «Ответ #18 31 Октября 2010, 03:56:01 »
Re: ColladaImport и DetecMouseCollision |
18
Цитировать
всё решается с помощью обычного коллижен рей чека
речь ведь идет о проверки многих объектов, которые могут находится друг за другом.. в этом случае CollisionRayCheck выдаст истину на все объекты, что пересеклись с лучем, верно?
anval | *** | Постоялец | Сообщений: 148 | «Ответ #19 31 Октября 2010, 09:27:29 »
Re: ColladaImport и DetecMouseCollision |
19
Привет.Я делаю так-оо-ray check-position tree(get closet item).
DimiS | **** | Старожил | Сообщений: 284 | «Ответ #20 31 Октября 2010, 17:06:13 »
Re: ColladaImport и DetecMouseCollision |
20
да, я действительно не очень хорошо объяснил суть метода
смысл использования колижен рей чека в том что у него в пропертях можно поставить опцию находить ближайшую точку(без этой опции он просто перебирает все полики пока не найдёт такой с которым есть пересечение, с этой опцией он проходит все полики и потом выдаёт ближайшую). Далее, имея точку пересечения с каждым объектом сравниваем дистанции и запоминаем ближайший объект и дистанцию до точки пересечения с ним, чтобы сравнить её со следующей дистанцией и т.д.

Колижен рей чек действительно очень тяжелая операция, чтобы ограничить количество его применений можно сначала воспользоваться проверкой пересечения лучом баунд бокса, или проверять с помощью ДетектМаусКоллижена. Я пользуюсь вторым вариантом, поскольку каждый вызов ДетектМаусКоллижена выполняется всё же очень быстро, а разница в скорости по сравнению с проверкой баунд бокса компенсируется более аккуратной выборкой объектов для проверки потом КолиженРейЧеком

Да, методов существует много, основной плюс предложенного мной это оптимальное сочетание цены/качества (геморроя/производительности)
 
  1 [2]
Печать
 
Quest3D - Русскоязычное сообщество > Quest3D > Программирование > ColladaImport и DetecMouseCollision
Перейти в: