Имеется орбитальная камера.
Камера крепится на конце рычага, центр рычага вращается добавлением попугаев с инпута осейXY мыши.
Мы можем понять в каком месте будет конец с камерой и понять что он спрятался под землёй или за препятствием и подвинуть камеру в точку пересечения.
Но я не могу понять как предсказать точку, в которой камера следующая по кругу вокруг центра соприкасается с землей.
Землёй может быть тиррейн или меш, который определяется трейсингом.
Можно конечно придумать какой то костыль, например ограничить угол поворота рычага.Но мне хочется понять суть задачи, может быть я где то ошибся или упустил из виду какие то детали.
Какой двиг то?
Обычно делают collision-объект типа сферы, а она естествеггым образом не даёт камере внутри нее проникнуть сквозь другие объекты.
Der FlugSimulator
> Обычно делают collision-объект типа сферы
Нет, это не подходит.Рассказать почему ?
Потому что физическая симуляция будет отставать от движений камеры.
Это должно выполняться математически.Допустимо трейсить точку исходя из вычисленных позиций на основе поворота и длинны рычага.
Есть у меня одна идея добавить ещё трейс, но я не очень люблю костыли которые могут не работать в частных случаях.
Движок анрил и там нет никакой коллизии на камере, можешь сам глянуть код компонента Spring Arm, там только трейсится сфера и там камера не останавливается как в референсе а приближается к центру.Соответственно мне нужно понять как допилить этот компонент, желательно не делая свои костыли с нуля.
Если есть такая реализация на юнити или на любом ддвижке я бы глянул.
IGamedevStudio
> физическая симуляция будет отставать от движений камеры.
С чего бы?
А вообще у тебя не вышло объяснить, чего конкретно ты хочешь. Какие-то "предсказания", орбиты, рычаги.
Совершенно непонятно, где у тебя требование, а где проблема.
Кроме того constraint можно определять с помощью shape raycast.
> Это должно выполняться математически.
А коллизии это что, не математика?
Der FlugSimulator
> А вообще у тебя не вышло объяснить, чего конкретно ты хочешь.
Хочу что бы камера при резких движениях упиралась в землю как это сделанно в референсе.
Плавные я там не показываю потому что при медленном перемещении будет обычный трейс работать, но при резком не будет.В референсе это как то решили и я хочу знать как.
В стандартном компоненте анрила она упирается, но не остаётся на месте контакта, а меняет свои позиции ближе к центру.
Der FlugSimulator
> Какие-то "предсказания", орбиты, рычаги.
Тип камеры "орбитальная, она так называется потому что вращается какбе по орбите вокруг центра.
Рычаг это компонент Spring Arm за который держится камера и является дочерним компонентом.В свою очередь он является дочерним к персонажу.
В компоненте Spring Arm Предсказание или Prediction на англ (если вам так удобней), если включена опция определения коллизий это делается в каждом кадре из места крепления рычага к его концу на котором "крепится" камера, и если есть попадание то позиции камеры на конце рычага двигается в эту точку (именно так работает сдвиг камеры в анриле к заднице персонажа).
А мне требуется определить точку не в этом месте, а в том где орбита камеры пересекает "землю" т.е. встречает преграду.
Камера поворачивается рывком, т.е. она сразу может поменять позицию пропустив угол в котором она цепляет землю, по этой причине детект коллизии даже каждый кадр из позиций камеры не является решением и по этому нужен какой то математический прогноз её траектории.Можно трейсить лучом сверху вниз с какой то высоты и найти точку соприкосновения луча и земли, а из этой точки вычислить угол или кватернион вращения основания рычага, а далее если этот угол будет ниже, то ограничивать его.Но у нас же ещё и вращение по двум осям происходит, выходит что надо считать их в одном месте по очереди сначала вертикальную ось в момент рывка камеры и после этого горизонтальную.Вроде бы так.Только осталось понять как это написать на кватернионах.
IGamedevStudio
> А мне требуется определить точку не в этом месте, а в том где орбита камеры
> пересекает "землю" т.е. встречает преграду.
В юнити можно бросить луч и собрать статистику, думаю и в анриле так можно.
RikiTikiTak
> В юнити можно бросить луч и собрать статистику, думаю и в анриле так можно.
Ну так задача то не в том что бы бросить луч.Хехе.
IGamedevStudio
С помощью этого луча ищется точка касание с колайдером и расстояние между камерой и колайдером. Дальше проверка остановить камеру при нужном расстоянии над колайдером. В теории это элементарно делается, в юнити есть готовые функции.
RikiTikiTak
Ты мой пост читал ? Теоретик
скорость, расстояние известны и вертите этим. У камеры можно взять скорость этих рывков. Думаю время посчитать не трудно, но я сам не математик. Вариант проще просто телепортировать камеру в нужную точку и блокировать если она ушла в землю. А ваш пост судя по ответам никто понять не может. Нужно что бы камера не уходила в землю или что?
RikiTikiTak
> Вариант проще просто телепортировать камеру в нужную точку и блокировать
А эту нужную точку как посчитать то ? :)))
RikiTikiTak
> У камеры можно взять скорость этих рывков.
Как и зачем если известен угол.Там будут очень малые значения при рывках.
Если считать скорость тогда ты предложешь пускать по кругу трейсинг каждый градус орбиты ?
Бред же.
Никак его не посчитать, только использовать костыли ввиде дополнительных трейсов
RikiTikiTak
> Нужно что бы камера не уходила в землю или что?
ага, и в посте описано как именно это происходит.
RikiTikiTak
> А ваш пост судя по ответам никто понять не может.
Ну блин, я думал с видео будет понятней.Потом значит пересоздам тему с картинками.
А эту нужную точку как посчитать то ? :)))
Луч кинуть перпендикулярно вниз от камеры, или согласно наклону камеры или наглаз выбрать нужный угол. В юнити этот луч собирает всю нужную информацию о точки попадании, добавить зазор какой нибудь например метр от земли. Точность тут не нужна, не космический корабль программируем.
Как и зачем если известен угол.Там будут очень малые значения при рывках.
Если считать скорость тогда ты предложешь пускать по кругу трейсинг каждый градус орбиты ?
Бред же.
Никак его не посчитать, только использовать костыли ввиде дополнительных трейсов
Это основная причина по которой я не использую сторонии ассеты. В самом скрипте где то заложена эта скрость или формула скорости, как её выдрать я не знаю. Это нужно что бы например можно по времени от нажатия кнопки остановить камеру. Тут нужно экспериментировать.
RikiTikiTak
Мой пост #4 по поводу луча и предположение как это сделать по радиусу.
Думаю что считать скорость это тоже самое что симулировать физику, это не нужно в этой задаче.
Если тебе нужна TPS камера на юнити то вот статья по этой теме, это обычная камера не то что я ищу https://catlikecoding.com/unity/tutorials/movement/orbit-camera/
Такая уже есть в анриле по дефолту.
А у меня тут типа RTS камера требуется.По сути её отличие только в том что она должна блокироваться землёй и оставаться в этом месте что бы было красиво.Хотя можно и тупо угол ограничить, но в таком случае это халтура если будут горы или впадины в которые хочется пролезть камерой.
IGamedevStudio
Не нужно скорость считать, она уже есть в скрипте в качестве переменной. Камера ведь двигается с определенной скоростью.
Я выше написал что бы я сделал если бы передо мной стояла такая задача. Больше идей нет, дальше нужно только кодить и экспериментировать.
RikiTikiTak
> Я выше написал что бы я сделал если бы передо мной стояла такая задача. Больше
> идей нет, дальше нужно только кодить и экспериментировать.
т.е. не осилить декомпозицию задачи и решать её методом тыка.
Смищно