Найти координаты произвольной точки у треугольника (полигон)

Работа с 2D и 3D графикой, видео, звуком.

Модератор: Mikle

Don Leno
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 421
Зарегистрирован: 13.10.2013 (Вс) 14:05

Найти координаты произвольной точки у треугольника (полигон)

Сообщение Don Leno » 17.01.2024 (Ср) 21:06

Здравствуйте!
Давно сюда не заходил.
Вопрос собственно по 3д графике. Работаю со старым 3д движком - Blitz3d. Создал террейн в 3д редакторе. Закинул в движок. Все работает. Только вот проблема как найти Y координату в произвольной точке треугольника этого террейна? Получить координаты вершин треугольника могу, а вот координаты произвольной точки в самом треугольнике понятия не имею. Не знаю с какой стороны подступиться. Подскажите, пожалуйста, хочу реализовать свой террейн на движке чтобы двигать шарик по нему можно было (для начала :D )

Добавлено позже:
В принципе X и Z (ось Y - высота) - мне не надо находить. К примеру,шар перемещается по террейну, тогда X и Z шара будут давать координаты этой произвольной точки. Проблема как вычислить Y, зная три вершины.
У вас нет доступа для просмотра вложений в этом сообщении.

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Найти координаты произвольной точки у треугольника (поли

Сообщение Mikle » 18.01.2024 (Чт) 22:47

Навскидку:
Сначала в 2D находишь проекции точек 4 и 1 на линию 3..2, назовём эти точки 44 и 11.
Координата Y этих точек легко вычисляется пропорцией:
Код: Выделить всё
y44=y3+(y2-y3)*L3_44/L3_2

Так же для точки 11.
Где L3_44 - длина вектора 3..44, а L3_2 соответственно длина вектора 3..2.
Находишь наклон треугольника относительно линии 3..2: делишь разницу высот точек 11 и 1 на длину вектора 11..1.
Умножаешь наклон на длину вектора 44..4, прибавляешь y44 - получаешь y4.

Don Leno
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 421
Зарегистрирован: 13.10.2013 (Вс) 14:05

Re: Найти координаты произвольной точки у треугольника (поли

Сообщение Don Leno » 19.01.2024 (Пт) 6:04

Да я явно неправильно точкам наименования дал. Позже переформулирую и зарисую и отпишусь о том что я понял.

Don Leno
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 421
Зарегистрирован: 13.10.2013 (Вс) 14:05

Re: Найти координаты произвольной точки у треугольника (поли

Сообщение Don Leno » 19.01.2024 (Пт) 19:58

Итак:
Разобрался я с векторами. вернее с их координатами и длинами. Но я не понял, про :
Находишь наклон треугольника относительно линии 3..2


Я также зарисовал все что понял из твоих пояснений, но четкой формулы получить значения необходимого Y пока нет. Пока не разберусь со всеми формулами - проверять их не смогу так как их еще в коде движка правильно записать надо :D

Есть предположение как "Найти наклон треугольника":
Если считать Линию 3..2 - гипотенузой, а Y2-Y3 противолежащим(?) катетом, то кажется по косинусу можно вычеслить угол - но является ли это наклоном треугольника?

Вот мне кажется что я вообще ничего не понял :?
У вас нет доступа для просмотра вложений в этом сообщении.

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Найти координаты произвольной точки у треугольника (поли

Сообщение Mikle » 19.01.2024 (Пт) 20:42

Что-то не то мутишь. Например:
Код: Выделить всё
L3_44_x=x4-x3

Это подразумевает, что треугольник не произвольный, а ориентированный относительно осей так, что линия 3_2 параллельная оси oX.
Но, если даже так, то это:
Код: Выделить всё
L3_44_y=y4-y3

вообще ниоткуда не следует, как и следующая строка.
Конкретно как найти наклон треугольника я дал формулу.

Don Leno
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 421
Зарегистрирован: 13.10.2013 (Вс) 14:05

Re: Найти координаты произвольной точки у треугольника (поли

Сообщение Don Leno » 20.01.2024 (Сб) 4:28

Что-то не то мутишь
- Вот оправдались мои подозрения :D
Код: Выделить всё
L3_44_x=x4-x3
L3_44_y=y4-y3

Но это формулы нахождения координат Вектора!? Я в интернете нашел, а также вычисление его длины. Ты же написал:
Где L3_44 - длина вектора 3..44


Про наклон треугольника - пойду еще покумекаю

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Найти координаты произвольной точки у треугольника (поли

Сообщение Mikle » 20.01.2024 (Сб) 10:25

Всё же уточни, треугольник всегда такой, как на рисунке - ориентированный вдоль оси X и равнобедренный? Или он может быть произвольный? Или вообще там регулярная сетка (тогда всё гораздо проще)?

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Найти координаты произвольной точки у треугольника (поли

Сообщение Mikle » 20.01.2024 (Сб) 12:04

Если задействовать D3DX математику (не знаю, что там в Blitz3d), для общего случая есть простой вариант в два действия:
С помощью PlaneFromPoints() находишь плоскость, содержащую треугольник.
С помощью PlaneIntersectLine() находишь точку пересечения вертикального луча из координат шарика с этой плоскостью.

Don Leno
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 421
Зарегистрирован: 13.10.2013 (Вс) 14:05

Re: Найти координаты произвольной точки у треугольника (поли

Сообщение Don Leno » 21.01.2024 (Вс) 17:36

Mikle, спс что отвечаешь.
Нет там обычная 3д модель! То есть сетка (меш) состоящая из треугольников (полигонов). То есть мне надо найти тот треугольник над которым находится шарик (условно игрок) и узнать высоту в точке под шариком, чтобы он мог двигать по 3д ландшафту. В Блитце есть стандартный ландшафт (террейн [terrain]) и есть функция считывания Y с этого ландшафта (высоты террейна в определенной точке). Мне же нужно создать свой 3д ланшафт в 3д редакторе (3д модель), но функции получения высоты стандартной для этого нет. Поэтому нужно написать свою функцию.
Из возможностей - я могу получить нужный треугольник под шариком и его 3-и вертекса с координатами. А дальше мне и нужны математические функции для высиления высоты (Координаты Y).
Отвечаю на твои вопросы - треугольник может быть любым, так как это треугольник на 3д модели и по разному ориентирован в 3д пространстве.

Выложу прогу скомпиленую. Надеюсь запуститься:
Управлнение - WASD
Пробел - перейти в Wireframe режим
Esc - выход

В исходнике - 3д модель с моим ландшафтом, чтобы ты мог понять что к чему, хотя я скрины скидывал. Также файл с раширением *.bb - является исходным кодом там можно увидеть код программы. Там бейскоподобный язык и скорее всего понятно будет. Блитз - бесплатный 3д движок с языком барсика.

Также добавлю исходник со стандартным террейном. Это то что я хочу сделать! Там функция TerrainY - получает координаты и выдает Y на выходе
Управление - стрелки
Enter - Включить затенение ландшафта
BackSpace - Включить режим сетки
Пробел - включение режима морфинга (добаление треугольников вблизи камеры)
У вас нет доступа для просмотра вложений в этом сообщении.

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Найти координаты произвольной точки у треугольника (поли

Сообщение Mikle » 21.01.2024 (Вс) 18:40

Don Leno писал(а):Отвечаю на твои вопросы

Я ещё спрашивал, что за математика в Blitz3d. Если это что-то подобное D3DX, то я выше дал самый простой рецепт. Если нет, то исходники этих функций на VB6 есть в местном блоге The trick: viewtopic.php?f=99&t=49733

Пример скачал, работает. Не пойму, зачем такой ландшафт делать моделью, когда в Blitz3d есть готовый террайн.

Don Leno
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 421
Зарегистрирован: 13.10.2013 (Вс) 14:05

Re: Найти координаты произвольной точки у треугольника (поли

Сообщение Don Leno » 21.01.2024 (Вс) 22:30

Кстати, после того как тебе ответил, я пошел искать алтернативный вариант. И твой пример
С помощью PlaneFromPoints() находишь плоскость, содержащую треугольник.
С помощью PlaneIntersectLine() находишь точку пересечения вертикального луча из координат шарика с этой плоскостью.

натолкнул меня на встроеные функции
PlaneFromPoints() - найти плоскоть треугольника (не знаю что значит) , но в блитце структура такая:

3д модель - это Mesh (сетка)
Состоит из Surface - поверхность, их может быть несколько
Surface содержит Vertex - вертексы
Из Vertex создаются Triangles - треугольники, состовляющие всю сетку Mesh

А вот для PlaneIntersectLine() есть функция
Код: Выделить всё
LinePick(x,y,z,dx,dy,dz)

Она создает тоже вроде луча из x,y,z до dx,dy,dz и если в луч сталкивается с каким либо объектом возвращает множество параметров:
Функции вызываются после LinePick для получения результатов:
Получение координат столкновения:
PickedX#()
PickedY#()
PickedZ#()
Получения координат нормали:
PickedNX#()
PickedNY#()
PickedNZ#()
Возвращает время потраченое на выполнение:
PickedTime#()
Возвращает Handle объекта:
PickedEntity()
Возвращает поверхность объекта:
PickedSurface()
Возвращает треугольник объекта:
PickedTriangle()


Благодаря этой функции LinePick я попробовал реализовать свою задумку. Прилагаю исходник. Вроде бы получилось, но есть баги - иногда высота перестает просчитываться. Пока выясняю где собака зарыта. :D
Спс за помощь. Жаль конечно с математикой чистой была бы готовая функция, а не костыль корявый :?
У вас нет доступа для просмотра вложений в этом сообщении.

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Найти координаты произвольной точки у треугольника (поли

Сообщение Mikle » 21.01.2024 (Вс) 22:44

Don Leno писал(а):Жаль конечно с математикой чистой была бы готовая функция, а не костыль корявый

Так я же написал, где взять исходники этих функций, если не хочешь пользоваться встроенными.

Don Leno
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 421
Зарегистрирован: 13.10.2013 (Вс) 14:05

Re: Найти координаты произвольной точки у треугольника (поли

Сообщение Don Leno » 23.01.2024 (Вт) 7:15

К сожалению я пока не умею пожключать библиотеки к движку. Там тож морока с ними. Но пока попробую на встроеных. А как либа называется? И апи как объявить эти, которые ты привел. На будущее пригодится когда до подкючения дллок дойду.
И кстати, я все таки решил задачу. Позже выложу исходник рабочий, чтобы мог увижеть результат. Так что можно обойтись и встроенными функциями. Только ими нажо научиться правильно пользоваться! :D
Thx, Mikle for help!
Последний раз редактировалось Don Leno 23.01.2024 (Вт) 8:46, всего редактировалось 1 раз.

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Найти координаты произвольной точки у треугольника (поли

Сообщение Mikle » 23.01.2024 (Вт) 8:23

Mikle писал(а):
Don Leno писал(а):Жаль конечно с математикой чистой была бы готовая функция, а не костыль корявый

Так я же написал, где взять исходники этих функций, если не хочешь пользоваться встроенными.

исходники

То есть там не dll, а код на бейсике.

Don Leno
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 421
Зарегистрирован: 13.10.2013 (Вс) 14:05

Re: Найти координаты произвольной точки у треугольника (поли

Сообщение Don Leno » 23.01.2024 (Вт) 8:49

Чтобы использовать код на бейсике, мне нужно создать длл и подключать к движку. Иначе никак. Он не подерживает стороние языки. Очень старый движок аж DirectX 7. Еще раз спс за помощь. Если что еще вернусь!

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Найти координаты произвольной точки у треугольника (поли

Сообщение Mikle » 23.01.2024 (Вт) 9:39

Don Leno писал(а):Чтобы использовать код на бейсике, мне нужно создать длл и подключать к движку.

Так у самого Blitz3d похожий на VB6 синтаксис, на нём и пиши функции.

Don Leno
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 421
Зарегистрирован: 13.10.2013 (Вс) 14:05

Re: Найти координаты произвольной точки у треугольника (поли

Сообщение Don Leno » 02.03.2024 (Сб) 11:54

Вот результат моей работы :D
https://forum.boolean.name/showthread.php?p=319422#post319422
Если что можешь написать сюда, не хочу создавать лишнюю тему, да и архив не влезет на форум (он более 2-х мегов)

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Найти координаты произвольной точки у треугольника (поли

Сообщение Mikle » 04.03.2024 (Пн) 19:36

У меня астероид не подбирается, сколько не жми ПКМ, хоть перед астероидом, хоть над ним.

Don Leno
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 421
Зарегистрирован: 13.10.2013 (Вс) 14:05

Re: Найти координаты произвольной точки у треугольника (поли

Сообщение Don Leno » 05.03.2024 (Вт) 20:08

Странно. Функция подбора у меня работает прекрасно. В ближайшие дни скину тебе только Ехе файл с дебаг инфой, напишешь нужные параметры после. Скорее всего что то не так с определение объекта для пикапа. Также добавлю еще один Ехе где вместо астероидов будут сферы. Там такая хитрость, что на самом деле ты подбираешь невидимые сферы, а 3д модель астероида привязана к ним. Также может эта сфера не определятся по нажатию - булеан переменная не выставляется для подбора и функция не работает. А зеленый конус от корабля до астероида мелькает? Что то вроде луча захвата...
Как там звук - не громко музыка звучит? Не было ошибки вроде Memory Acsess Violation (Mav)? Еще какие нибудь ошибки есть? Фпс какой? Параметры твоего железа и система какая(важно)? А сам кораблик по нажатию Лкм летает? Торговля с планетой работает (нужно нажать на пробел) . А также принимаются идеи по улучшению геймплея (но только геймплея пока, графика плоха очень я знаю - я не художник и не 3д моделер, в бета версии буду нарабатывать)
Огромное спасибо за участие. На форуме *булеан.нейм*, мало кто пишет в теме.
Кстати, астероид подбирается с малого растояния. На большой дистанции его нельзя подобрать. Может нужно ближе подлететь? Правда я не сделал показ радиуса подбора - мой недосмотр. Проверь это.
Также игра компилилась на Виндовс 7, иногда говорят под ХПи не работает и нужно компилировать под той системой где она проверяется. Под системами выше 7ки не знаю как будет работать. Если твоя система другая выставь *Совместимость* и *Запускать от админа*. Все пока варианты исчерпал. Жду твоего отаета. После скину патченные Ехе файлы.

Также влевом нижнем углу экрана есть параметры игрока:
Топливо, энергия, кислород? Какие там значения?


Вернуться в Мультимедиа

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 24

    TopList  
cron