Тема: PlayCanvas
Показать сообщение отдельно
Старый 21.03.2017, 23:18   #143
moka
.
 
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений
(для 6,863 пользователей)
Ответ: PlayCanvas

Сообщение от RegIon Посмотреть сообщение
Вопрос №2, у нас есть Mesh, мне нужно по координатам rayCast получить UV.
Как это правильно сделать?

Набросал скрипт, который если я ничего не напутал, получает rayCast point, переводит его в локальную относительно объекта и сравнивает с вершинами в меше.
По моей задумке на ближайшей вершине нужно брать UV. Так? (Влом интерполировать между несколькими)

Правда в PC с векторной математикой как-то неудобно.
https://playcanvas.com/editor/code/452172?tabs=7201110
https://playcanvas.com/editor/code/4...201110&line=87

var d = this._new.length();
   if(d < 0.2)
Вот так я бы не делал, т.к. это будет совсем не точным, и большие треугольники будет простреливать.

Думаю есть спец-алгоритмы как это делать быстро, но в голову приходит такая идея:
1. Получаешь список вершин отсортированных по дистанции от точки, сперва ближе, потом дальше.
2. Строишь индекс по индексному буферу треугольников-вершин. Чтобы по индексу вершины треугольник и другие вершины получать было быстро.
3. Бежишь по сортированным вершинам, получаешь их треугольники.
3а. Вычисляешь нормаль треугольника по трём вершинам.
3б. Трансформируешь точку относительно вершине используя нормаль.
3в. Проверяешь если точка в плоскости треугольника.
3г. Проверяешь если точка в рамках треугольника (3ех вершин).
4. Если что-то не удовлетворено, то запоминаешь индекс треугольника чтобы его заного не вычислять, и продолжаешь №3.
5. Когда найден треугольник, интерполировать UV между уже будет не сложно (формулы онлайн есть).

Вообще было бы хорошо иметь встроенную фичу такого рода.

Учти что vertexBuffer имеет "формат", там не только позиции, но и нормали, цвет и ещё всякая инфа в нём. Следственно там не будет 3 элемента на вершину, а будет по разному исходя из формата. getFormat (http://developer.playcanvas.com/en/a...html#getFormat) - получает формат буфера.
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Mr_F_ (21.03.2017)