• Добро пожаловать на Quest3D - Русскоязычное сообщество.
 

Новости:

Форум Quest3D восстановлен!

Главное меню

ColladaImport и DetecMouseCollision

Автор Deepl, 13 сентября 2010, 16:22:35

« назад - далее »

Sqwer

ЦитироватьВообще, пользоваться матрицами не самый лучший способ.
Представь, что в одной точке находится огромный шар и маленький куб.
А еще лучше, длиииииный параллелепипед и сфера. Матрицы - одинаковые. А конец параллелепипеда к нам ближе. )


2) делать рендер в текстуру, и по ней  определять, цвет(тексель) какого объекта находится под  указателем курсора. (потяжелее)
не составит труда для знатоков С++ и DirectX  ;)

DimiS

ппц, чёто вы перемудрили с баундбоксами
всё решается с помощью обычного коллижен рей чека, есть куча экзамплов, например
\Examples\Advanced\Pick mesh with mouse.cgr

Sqwer

#17
Сам алгоритм нахождения пересечения луча с мешем очень тяжёл (дефалтный метод в ДХ9,  в ДХ10 и ДХ11   метод занесли в D3DX )  , при его выполнении проходит выборка  из всех треугольников.
само сабой   понятно, что быстродействия никакого.

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


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

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

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

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

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



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




Ruslan

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

anval

Привет.Я делаю так-оо-ray check-position tree(get closet item).

DimiS

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

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

Да, методов существует много, основной плюс предложенного мной это оптимальное сочетание цены/качества (геморроя/производительности)