Суть вопроса такая, есть в библиотеках ДГУИ полезная функция:
method Win2World takes real X, real Y, real Range returns VECTOR3
Переводит относительные оконые координаты (от -1 до +1), в мировые, результирующая точка будет расположена на растоянии от камеры равном Range
В ренж нужно передать растояние от камеры до проекции этой точки на террейн, и вопрос заключается в том каким способом лучше найти это пересечение, пока есть вараинт перебора циклом с мелким шагом, но мне кажется это не лучшее решение, ведь при огромных расстояних это вызовет высокую нагрузку

Принятый ответ

а разве мы не задаём его триггерно?
посмотри как это сделано в дгуи
там же пример есть
ну а вообще
GetCameraTargetPositionX/Y/Z()-GetCameraEyePositionX/Y/Z()
это координаты вектора
а потом тупо высчитываем длинну вектора (гуглим вектора или теорему Пифагора)
`
ОЖИДАНИЕ РЕКЛАМЫ...
0
21
8 лет назад
Отредактирован Raised
0
Если я хорошо помню, то в этом случае нужно найти расстояние от точки-приказа юниту двигаться до проекции этой точки на плоскость камеры. Опишу по этапам:
  • вектор, который представляет собой ось, проходящая через точки GetCameraEyePositionX,Y,Z и GetCameraЕфкпуеPositionX,Y,Z - это нормаль к плоскости камеры (у меня есть ряд оснований это утверждать)
  • с помощью этой нормали формируем уравнение плоскости в точке CameraEye
  • любой приказ (предположительно) в любую точку карты проецируется на ланд под углом атаки камеры
  • находим проекцию вектора, выходящего из точки приказа на плоскость камеры (этот вектор паралелен вектору камеры)
  • считаем расстояние от этой проекции до точки приказа(это и есть расстояние от этой точки на плоскости камеры (экране) до точки, в которую был отдан приказ). Если я не ошибаюсь - это должно работать.
0
28
8 лет назад
0
а разве мы не задаём его триггерно?
посмотри как это сделано в дгуи
там же пример есть
ну а вообще
GetCameraTargetPositionX/Y/Z()-GetCameraEyePositionX/Y/Z()
это координаты вектора
а потом тупо высчитываем длинну вектора (гуглим вектора или теорему Пифагора)
Принятый ответ
0
21
8 лет назад
0
Ну это даст расстояние от глаза камеры до цели камеры. Что дальше то? Что толку от длины?
0
24
8 лет назад
0
Ребята, забудьте о камере вообще, это не суть.
Есть произвольная точка пространства С , через нее проводится вектор, в месте где этот вектор пересекается с ландшафтом будет Х - как ее найти?
Загруженные файлы
0
28
8 лет назад
0
darkowlom, а зачем тебе точка пересечения с ландшафтом
объясни что хочешь сделать а я подскажу как лучше это сделать
0
24
8 лет назад
0
nvc123, в широком профиле интересует, без одной конкретной спецификации(она конечно есть, но интересует широкопрофильная реализация)
0
28
8 лет назад
0
darkowlom, в широком профиле только метод последовательного приближения
тут нужно рассматривать каждый конкретный случай и адаптироваться под него
0
24
8 лет назад
Отредактирован darkowlom
0
в широком профиле только метод последовательного приближения
Вот это мне и надо было узнать, теперь вопрос об оптимизации перебора, скорее всего буду использовать разбиение вектора на участки и проверку в сторону уменьшения, если на участке есть пересечение. Это позволит сразу отсеять половину карты и оставшийся участок делить на две части пока не получится минимальный отрезок на котором есть пересечение и его перебирать более детально. Тем более это поможет избежать лишних переборов если пересечения не существует вообще
0
28
8 лет назад
Отредактирован nvc123
0
Вот это мне и надо было узнать, теперь вопрос об оптимизации перебора, скорее всего буду использовать разбиение вектора на участки и проверку в сторону уменьшения, если на участке есть пересечение. Это позволит сразу отсеять половину карты и оставшийся участок делить на две части пока не получится минимальный отрезок на котором есть пересечение и его перебирать более детально. Тем более это поможет избежать лишних переборов если пересечения не существует вообще
бред
берёшь каждый конкретный случай и юзаешь подходящее решение
нафиг обобщать то что обобщить невозможно
0
24
8 лет назад
0
nvc123, конкретный случай- проекция точки экрана на террейн по вектору. В нормальных средах можно запустить рейтрейс по вектору до первого пересечения, но тут мы не можем получить матрицу объекта и придется фактически делать рейтрес именно перебором, другого решения я не вижу.
0
28
8 лет назад
0
darkowlom, раз ты курил дгуи могу предположить что вектор равен вектору камеры
тогда всё намного проще ибо у нас есть точка отсчёта (цель камеры)
я прав?
0
24
8 лет назад
0
точку отсчета мы имеем, да , вектор только равен не вектору камеры, а вектору поля зрения относительно точки экрана. Но мне не нужно находить вектор, я имею две точки, спроецировав клик через функцию дгуи на два разных расстояния и могу найти нужный вектор. Осталось найти пересечение этого вектора с ландшафтом
Итого у нас есть: вектор и точка отсчета
0
28
8 лет назад
Отредактирован nvc123
0
фига се я написал
даже самому страшно читать
darkowlom, насколько я понял ты хочешь сделать нечто наподобие точки каста спела
нажал на кнопку и на том месте где она была чтото произошло(врыв например)
тут стоит задать максимальную и минимальную высоту ландшафта в виде констант
так тебе нужно будет проверять лишь ту часть которая лежит в этом промежутке
так же стоит смотреть третью координату вектора (z)
параллелен ли вектор плоскости XY (т.е. z==0)
или направлен вверх (т.е. z>0)
или направлен вниз (z<0)
и рассматривать их как разные случаи
так же стоит узнать максимально возможную длину вектора
это все поможет сократить количество итераций
darkowlom, твой способ с пересечением может привести к багам в случае если z вектора близко к 0
т.е. вектор пересекает ландшафт несколько раз
например сначала он пересекает гору а за ней равнину
если на карте нету шпилей или резких ям (т.е. небольших областей с сильным искривлением ландшафта) то всю карту можно разбить на области по высотам
например в области a высота варьируется от 0 до 20 (равнина)
а в области b от 150 до 210 (возвышенность)
так можно будет сначала определить какие области вектор пересекает а потом внутри областей проводить переборы
есть правда ещё 1 способ без перебора но он баганый и медленный
берём какого нибудь игрока и помещаем глаз его камеры в точку твоей кнопки а в качестве вектора камеры устанавливаем твой вектор
потом с помощью функций GetCameraTargetPositionX/Y/Z() узнаём точку касания
синхронизируем их между игроками и т.д.
но тут тратится куча времени на синхрон и установку камеры
имхо первый вариант лучше
0
24
8 лет назад
0
Да, минимальные и максимальные параметры конечно будут указаны
т.е. вектор пересекает ландшафт несколько раз
Смотри в моем способе идет проверка, если на участке есть пересечение, он делится попоплам и берется половина ближайшая к камере, потом если в нем тоже есть пересечение процедура повторяется и тд, до тех пор пока не останется только одно пересечение, с этим проблем не будет) Спасибо, думаю вопрос можно закрыть
0
28
8 лет назад
0
как ты определишь пересечение?
имхо лучше делить на области и перебирать их по удалению от камеры
0
24
8 лет назад
Отредактирован darkowlom
0
Пересечнеие будет где высота точки совпадает с высотой ланда
0
28
8 лет назад
0
darkowlom, а для этого нужно перебрать все точки
смысл делить на 2 если мы и так весь промежуток проверяем
0
24
8 лет назад
0
nvc123, да, действительно, не подумал, правда перебор областей тоже не спасет, фактиечски это о же перебор по вектору с шагом, хотя ля единичного проэцирования а не проэцирования пучков, нагрузка будет невелика даже на протяжении всей карты
0
28
8 лет назад
0
darkowlom, перебор областей позволяет сразу отбросить те области где пересечений точно нету (вектор не пересекает верхнюю и нижнюю границы ланда в области) и может дать область в которой точно есть пересечение (вектор пересекает и верхнюю и нижнюю границы)
Чтобы оставить комментарий, пожалуйста, войдите на сайт.