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

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