ue4 камера сквозь стены
В UE камера игрока проходит сквозь стены
Если игрок подойдет к стене и посмотрит вниз, то его камера проходит сквозь стену.
Я так понял, при наклоне капсула игрока тоже наклоняется, не только камера. В юнити у меня только камера наклонялась, я ее там лишь в центр коллайдера игрока сдвинул, а здесь как быть?
Переделай контроллер под свои нужды.
Для камеры учитывай коллизии со стенами. При наклоне камеру оставляй на месте, если она «упирается» в стену.
KKH
> При наклоне камеру оставляй на месте, если она «упирается» в стену
Знать-бы еще, как это делается)
Чтобы капсула не наклонялась, в свойствах PlayerCharacter в категории Pawn нужно убрать флажок Use Controller Rotation Pitch (в редакторе блупринтов). Чтобы камера при этом продолжила наклоняться (если она child CapsuleComponent, то она наследует его трансформации), нужно в ее свойствах поставить флажок Use Pawn Control Rotation. Для вида от первого лица этого должно хватить.
Lord_Alexander_III
Спасибо, получилось)
dmitrykozyr
К капсуле прикрепи элимент SpringArm и к нему камеру. И будет тебе счастье!
wowa12364
> К капсуле прикрепи элемент SpringArm и к нему камеру. И будет тебе счастье!
Уже так и сделано. Я наверное это давно сделал по видеоуроку, уже об этом и забыл. Центр SpringArm находится в центре капсулы, а камера находится на уровне глаз.
Lord_Alexander_III
Убрал флажок Use Controller Rotation Pitch и игрок начал сквозь дверные проемы нормально проходить. А то раньше если к проему боком стать, посмотреть вниз и попробовать пройти, то не получалось, т.к. наверное коллайдер игрока тоже наклонялся. А сейчас он не наклоняется и можно спокойно проходить сквозь узкие места. Но с отключенным флажком камера проходит сквозь все, если близко стать и посмотреть вниз. Даже сквозь то, с чем до отключения флажка не было проблем
Near Clip Plane было 10, уменьшил до 1, но не помогло.
Как я понимаю, тебе нужен вид только от первого лица? И у тебя Spring Arm с нулевым Target Arm Length? Если так, то убери Spring Arm вообще, пусть камера будет прямым чилдом Capsule Component.
Use Controller Rotation Pitch у Pawn’а должен быть выключен, чтобы капсула не наклонялась, а у камеры включен Use Pawn Control Rotation, чтобы наклонялась камера.
Lord_Alexander_III
Ура, заработало. Спасибо большое. Всех с праздником =)
UE4 Мой игрок (скететал меш он) Проходит сквозь стены никакая колизия ему не помогает (и стенам тоже)
Вот что откопал:
Реакция на столкновения
Collision Responses и Trace Responses формируют основу того, как Unreal Engine 4 обрабатывает столкновения и рей кастинг (ray casting) запросы время выполнения.
Каждый объект, который может столкнуться получает Object Type и ряд параметров, которые определяют, как он будет взаимодействовать с другими типами объектов.
При столкновении или перекрытии объектов могут генерироваться события, каждому из объектов можно настроить параметры влияния на другие типы объектов, будут ли они сталкиваться или игнорировать друг друга.
Trace Responses работают в основном так же. Трейс сам по себе может быть определен как один из типов объектов, позволяя другим объектам на основе своих настроек либо блокировать либо игнорировать его.
Есть несколько вещей, которые нужно иметь в виду, что бы понимать, как обрабатываются столкновения:
Блокировка (Blocking) будет происходить естественным образом между двумя (или более) объектами с заданными параметрами блокировки.
Тем не менее, для выполнения Event Hit событий должен быть включен Hit Event, который используется в блупринтах, разрушаемых объектах, триггерах и т. д…
Объекты с параметром Overlap часто выглядят как объекты с параметром Ignore, и без Event Hit, они по существу одинаковы.
Для двух (или более) объектов блокирующих друг друга, у обоих должны быть выставлены соответствующее настройки.
Для двух или более объектов: если параметры одного установлены в Blocking, а второго в Overlap, то будет происходить только Overlap (перекрытие) но не блокирование объектами друг друга.
Overlap события могут быть сгенерированы даже если объект блокирует другой, особенно при движении на высоких скоростях.
Не рекомендуется использовать одновременно как Blocking так и Overlap параметры. Хотя конечно это возможно, может потребоваться ручная настройка.
Если один объект установлен в Ignore, а другой в Overlap, объекты будут игнорировать друг друга а так же не будут генерироваться Overlap эвенты.
Для целей тестирования уровней:
По умолчанию камера при игре в редакторе является типом Pawn.
По умолчанию камера в Simulate режиме не является типом Pawn. Она может свободно проходить через в
Ue4 камера сквозь стены
Как человек увлекающийся, я быстро загораюсь какой-то идеей. Однако по прошествии некоторого времени (обычно небольшого его количества) идея уже кажется мне не столь привлекательной, как раньше. Более того, я могу полностью разочароваться в ней. Раньше мне это очень сильно мешало доводить проекты до конца. Но теперь ко мне пришла старость:), и я (кажется) научился справляться с этим недостатком и даже немного использовать его в своих целях.
К чему это я? Подустал я пилить боевую систему и решил немного отвлечься, занявшись освещением. Эту тактику работы я считаю правильной для увлекающегося человека — чуть-чуть поделать одно, пока интересно, потом чуть-чуть поделать другое, а потом опять вернуться к предыдущему этапу, когда снова станет интересно. Так я потихоньку двигаюсь по всем фронтам, и это иногда спасает от серьезных ошибок.
Например сейчас, когда я занялся освещением и столкнулся с первыми проблемами, я поблагодарил себя за то, что не стал делать все модели для игры сразу, а сделал только небольшую порцию. Оказывается, согласно некоторым руководствам и темам на форумах, я делал свои модели немного неправильно. И если бы я создал весь арт сразу, мне пришлось бы весь его переделывать. И с этим я уже сталкивался несколько раз при работе с UDK.
Первая проблема с освещением в UDK, с которой я столкнулся — это прохождение света сквозь стену. Вероятно, это актуально для модульных конструкций, но на официальном форуме Epic’ов такая проблема возникала у людей, использующих BSP в качестве основной геометрии для уровней.
Решений предлагалось несколько: от увеличения числа полигонов поверхности и увеличения разрешения LightMap до преобразования все в Static Mesh и применение модификатора Shell в 3D Max, который сделает поверхности Mesh’ей полностью закрытыми (без дырок). Увеличение разрешения для LightMap действительно некоторым помогало, но не избавляло от проблем полностью. К тому же разрешение LightMap помогает только для статического освещения. Создание полностью замкнутых Mesh’ей мне не помогло. Хотя замкнутые поверхности полезны при создании разрушаемого окружения средствами UDK (Fractured Mesh).
Для динамического освещения, которое я решил использовать, мне частично помог способ, указанный на рисунке ниже. Я для источника освещения установил режим отбрасывания теней (Light Shadow Mode) в LightShadow_Normal. По умолчанию же используется режим LightShadow_Modulate, который создает более мягкие и реалистичные тени, но вызывает эффект просачивания света сквозь стены.
Но установка режима LighShadow_Normal для источника освещения привела к новой проблеме. На источник освещения начал неправильно влиять ландшафт Landscape, который стал вносить свой вклад в формирование тени. В результате свет на стене стал как бы «обрезанным». Это хорошо видно на предыдущем рисунке слева (дальняя стенка) и ниже на рисунке (правая сторона).
Также, по непроверенным данным, может помочь полное отключение отбрасывания теней объектом Landscape. Это делается в исходниках класса LandscapeComponent. Достаточно в свойствах по умолчанию (секции DefaultProperties) прописать CastShadow = FALSE. В этом случае функционирование LOD-уровней не будет нарушено, но ландшафт перестанет отбрасывать тени. Кому-то этот способ может подойти, если наличие LOD у ландшафта важнее. Это актуально для больших открытых уровней.
Спасением может оказаться и использование устаревшего в UDK объекта Terrain. Насколько я мог убедиться, со старым добрым Terrain таких проблем с отбрасыванием теней не возникает. Но хочу предупредить, что разработчики UDK обещают отказаться от поддержки Terrain в более поздних версиях, о чем упоминали на своем сайте.
Ue4 камера проходит сквозь стены
В UE камера игрока проходит сквозь стены
Если игрок подойдет к стене и посмотрит вниз, то его камера проходит сквозь стену.
Я так понял, при наклоне капсула игрока тоже наклоняется, не только камера. В юнити у меня только камера наклонялась, я ее там лишь в центр коллайдера игрока сдвинул, а здесь как быть?
Переделай контроллер под свои нужды.
Для камеры учитывай коллизии со стенами. При наклоне камеру оставляй на месте, если она «упирается» в стену.
KKH
> При наклоне камеру оставляй на месте, если она «упирается» в стену
Знать-бы еще, как это делается)
dmitrykozyr пускаешь луч в сторону взгляда и отодвигаешь камеру. Простой вариант — написать свой контроллер наследованием от Character Controller и там реализовать необходимую логику в блупринтах.
Чтобы капсула не наклонялась, в свойствах PlayerCharacter в категории Pawn нужно убрать флажок Use Controller Rotation Pitch (в редакторе блупринтов). Чтобы камера при этом продолжила наклоняться (если она child CapsuleComponent, то она наследует его трансформации), нужно в ее свойствах поставить флажок Use Pawn Control Rotation. Для вида от первого лица этого должно хватить.
Lord_Alexander_III
Спасибо, получилось)
Сделал уровень с очень узкой комнатой — по ширине раза в полтора больше ширины капсулы игрока.
Пробовал включать/отключать Use Controller Rotation Pitch, но в любом случае если в этой комнате смотреть вниз, то камера наклоняется и проходит сквозь стену.
Пока что не сильно, но я хочу игрока сделать повыше и поуже, я так понимаю, это делается через параметры Half Heigh и Radius. Если их сделать 135 и 25 соответственно, то камера вообще полностью сквозь стены проходит
dmitrykozyr
К капсуле прикрепи элимент SpringArm и к нему камеру. И будет тебе счастье!
wowa12364
> К капсуле прикрепи элемент SpringArm и к нему камеру. И будет тебе счастье!
Уже так и сделано. Я наверное это давно сделал по видеоуроку, уже об этом и забыл. Центр SpringArm находится в центре капсулы, а камера находится на уровне глаз.
Lord_Alexander_III
Убрал флажок Use Controller Rotation Pitch и игрок начал сквозь дверные проемы нормально проходить. А то раньше если к проему боком стать, посмотреть вниз и попробовать пройти, то не получалось, т.к. наверное коллайдер игрока тоже наклонялся. А сейчас он не наклоняется и можно спокойно проходить сквозь узкие места. Но с отключенным флажком камера проходит сквозь все, если близко стать и посмотреть вниз. Даже сквозь то, с чем до отключения флажка не было проблем
Near Clip Plane было 10, уменьшил до 1, но не помогло.
Как я понимаю, тебе нужен вид только от первого лица? И у тебя Spring Arm с нулевым Target Arm Length? Если так, то убери Spring Arm вообще, пусть камера будет прямым чилдом Capsule Component.
Use Controller Rotation Pitch у Pawn’а должен быть выключен, чтобы капсула не наклонялась, а у камеры включен Use Pawn Control Rotation, чтобы наклонялась камера.
Lord_Alexander_III
Ура, заработало. Спасибо большое. Всех с праздником =)
В UE камера игрока проходит сквозь стены
Если игрок подойдет к стене и посмотрит вниз, то его камера проходит сквозь стену.
Я так понял, при наклоне капсула игрока тоже наклоняется, не только камера. В юнити у меня только камера наклонялась, я ее там лишь в центр коллайдера игрока сдвинул, а здесь как быть?
Переделай контроллер под свои нужды.
Для камеры учитывай коллизии со стенами. При наклоне камеру оставляй на месте, если она «упирается» в стену.
KKH
> При наклоне камеру оставляй на месте, если она «упирается» в стену
Знать-бы еще, как это делается)
dmitrykozyr пускаешь луч в сторону взгляда и отодвигаешь камеру. Простой вариант — написать свой контроллер наследованием от Character Controller и там реализовать необходимую логику в блупринтах.
Чтобы капсула не наклонялась, в свойствах PlayerCharacter в категории Pawn нужно убрать флажок Use Controller Rotation Pitch (в редакторе блупринтов). Чтобы камера при этом продолжила наклоняться (если она child CapsuleComponent, то она наследует его трансформации), нужно в ее свойствах поставить флажок Use Pawn Control Rotation. Для вида от первого лица этого должно хватить.
Lord_Alexander_III
Спасибо, получилось)
Сделал уровень с очень узкой комнатой — по ширине раза в полтора больше ширины капсулы игрока.
Пробовал включать/отключать Use Controller Rotation Pitch, но в любом случае если в этой комнате смотреть вниз, то камера наклоняется и проходит сквозь стену.
Пока что не сильно, но я хочу игрока сделать повыше и поуже, я так понимаю, это делается через параметры Half Heigh и Radius. Если их сделать 135 и 25 соответственно, то камера вообще полностью сквозь стены проходит
dmitrykozyr
К капсуле прикрепи элимент SpringArm и к нему камеру. И будет тебе счастье!
wowa12364
> К капсуле прикрепи элемент SpringArm и к нему камеру. И будет тебе счастье!
Уже так и сделано. Я наверное это давно сделал по видеоуроку, уже об этом и забыл. Центр SpringArm находится в центре капсулы, а камера находится на уровне глаз.
Lord_Alexander_III
Убрал флажок Use Controller Rotation Pitch и игрок начал сквозь дверные проемы нормально проходить. А то раньше если к проему боком стать, посмотреть вниз и попробовать пройти, то не получалось, т.к. наверное коллайдер игрока тоже наклонялся. А сейчас он не наклоняется и можно спокойно проходить сквозь узкие места. Но с отключенным флажком камера проходит сквозь все, если близко стать и посмотреть вниз. Даже сквозь то, с чем до отключения флажка не было проблем
Near Clip Plane было 10, уменьшил до 1, но не помогло.
Как я понимаю, тебе нужен вид только от первого лица? И у тебя Spring Arm с нулевым Target Arm Length? Если так, то убери Spring Arm вообще, пусть камера будет прямым чилдом Capsule Component.
Use Controller Rotation Pitch у Pawn’а должен быть выключен, чтобы капсула не наклонялась, а у камеры включен Use Pawn Control Rotation, чтобы наклонялась камера.
Lord_Alexander_III
Ура, заработало. Спасибо большое. Всех с праздником =)
UE4 Мой игрок (скететал меш он) Проходит сквозь стены никакая колизия ему не помогает (и стенам тоже)
Вот что откопал:
Реакция на столкновения
Collision Responses и Trace Responses формируют основу того, как Unreal Engine 4 обрабатывает столкновения и рей кастинг (ray casting) запросы время выполнения.
Каждый объект, который может столкнуться получает Object Type и ряд параметров, которые определяют, как он будет взаимодействовать с другими типами объектов.
При столкновении или перекрытии объектов могут генерироваться события, каждому из объектов можно настроить параметры влияния на другие типы объектов, будут ли они сталкиваться или игнорировать друг друга.
Trace Responses работают в основном так же. Трейс сам по себе может быть определен как один из типов объектов, позволяя другим объектам на основе своих настроек либо блокировать либо игнорировать его.
Есть несколько вещей, которые нужно иметь в виду, что бы понимать, как обрабатываются столкновения:
Блокировка (Blocking) будет происходить естественным образом между двумя (или более) объектами с заданными параметрами блокировки.
Тем не менее, для выполнения Event Hit событий должен быть включен Hit Event, который используется в блупринтах, разрушаемых объектах, триггерах и т. д…
Объекты с параметром Overlap часто выглядят как объекты с параметром Ignore, и без Event Hit, они по существу одинаковы.
Для двух (или более) объектов блокирующих друг друга, у обоих должны быть выставлены соответствующее настройки.
Для двух или более объектов: если параметры одного установлены в Blocking, а второго в Overlap, то будет происходить только Overlap (перекрытие) но не блокирование объектами друг друга.
Overlap события могут быть сгенерированы даже если объект блокирует другой, особенно при движении на высоких скоростях.
Не рекомендуется использовать одновременно как Blocking так и Overlap параметры. Хотя конечно это возможно, может потребоваться ручная настройка.
Если один объект установлен в Ignore, а другой в Overlap, объекты будут игнорировать друг друга а так же не будут генерироваться Overlap эвенты.
Для целей тестирования уровней:
По умолчанию камера при игре в редакторе является типом Pawn.
По умолчанию камера в Simulate режиме не является типом Pawn. Она может свободно проходить через в
Ue4 камера проходит сквозь стены
Как человек увлекающийся, я быстро загораюсь какой-то идеей. Однако по прошествии некоторого времени (обычно небольшого его количества) идея уже кажется мне не столь привлекательной, как раньше. Более того, я могу полностью разочароваться в ней. Раньше мне это очень сильно мешало доводить проекты до конца. Но теперь ко мне пришла старость:), и я (кажется) научился справляться с этим недостатком и даже немного использовать его в своих целях.
К чему это я? Подустал я пилить боевую систему и решил немного отвлечься, занявшись освещением. Эту тактику работы я считаю правильной для увлекающегося человека — чуть-чуть поделать одно, пока интересно, потом чуть-чуть поделать другое, а потом опять вернуться к предыдущему этапу, когда снова станет интересно. Так я потихоньку двигаюсь по всем фронтам, и это иногда спасает от серьезных ошибок.
Например сейчас, когда я занялся освещением и столкнулся с первыми проблемами, я поблагодарил себя за то, что не стал делать все модели для игры сразу, а сделал только небольшую порцию. Оказывается, согласно некоторым руководствам и темам на форумах, я делал свои модели немного неправильно. И если бы я создал весь арт сразу, мне пришлось бы весь его переделывать. И с этим я уже сталкивался несколько раз при работе с UDK.
Первая проблема с освещением в UDK, с которой я столкнулся — это прохождение света сквозь стену. Вероятно, это актуально для модульных конструкций, но на официальном форуме Epic’ов такая проблема возникала у людей, использующих BSP в качестве основной геометрии для уровней.
Решений предлагалось несколько: от увеличения числа полигонов поверхности и увеличения разрешения LightMap до преобразования все в Static Mesh и применение модификатора Shell в 3D Max, который сделает поверхности Mesh’ей полностью закрытыми (без дырок). Увеличение разрешения для LightMap действительно некоторым помогало, но не избавляло от проблем полностью. К тому же разрешение LightMap помогает только для статического освещения. Создание полностью замкнутых Mesh’ей мне не помогло. Хотя замкнутые поверхности полезны при создании разрушаемого окружения средствами UDK (Fractured Mesh).
Для динамического освещения, которое я решил использовать, мне частично помог способ, указанный на рисунке ниже. Я для источника освещения установил режим отбрасывания теней (Light Shadow Mode) в LightShadow_Normal. По умолчанию же используется режим LightShadow_Modulate, который создает более мягкие и реалистичные тени, но вызывает эффект просачивания света сквозь стены.
Но установка режима LighShadow_Normal для источника освещения привела к новой проблеме. На источник освещения начал неправильно влиять ландшафт Landscape, который стал вносить свой вклад в формирование тени. В результате свет на стене стал как бы «обрезанным». Это хорошо видно на предыдущем рисунке слева (дальняя стенка) и ниже на рисунке (правая сторона).
Также, по непроверенным данным, может помочь полное отключение отбрасывания теней объектом Landscape. Это делается в исходниках класса LandscapeComponent. Достаточно в свойствах по умолчанию (секции DefaultProperties) прописать CastShadow = FALSE. В этом случае функционирование LOD-уровней не будет нарушено, но ландшафт перестанет отбрасывать тени. Кому-то этот способ может подойти, если наличие LOD у ландшафта важнее. Это актуально для больших открытых уровней.
Спасением может оказаться и использование устаревшего в UDK объекта Terrain. Насколько я мог убедиться, со старым добрым Terrain таких проблем с отбрасыванием теней не возникает. Но хочу предупредить, что разработчики UDK обещают отказаться от поддержки Terrain в более поздних версиях, о чем упоминали на своем сайте.
Создание области видимости с затенением [UE4]
Добрый день! Первый мой пост собрал больше двухсот лайков и два десятка подписчиков. Поэтому, как и обещал, делаю второй пост про создание области видимости с затенением.
Если кому-то удобнее смотреть видео или какие-то детали разобраны недостаточно подробно, то в конце поста есть ссылка на видеоурок (состоит из двух частей).
В данном примере мы будем использовать процедурную сетку и трассировку линий. А для того чтобы избежать лишнего использования ресурсов и не создавать избыточные элементы сетки, напишем, основываясь на методе половинного деления, функцию, которая будет уточнять положение границ объектов. На картинке выше красным показаны базовые линии сетки (в данном примере их всего 4 на область видимости с углом 90 градусов), а синим — линии сетки, которые образовались после уточнения границ (их 10, так как для каждой границы создается две линии). И этого хватило чтобы правильно отрисовать тени.
Конечно, более мелкие объекты могут остаться незамеченными (базовая сетка должна почувствовать, что между ее «лучами» что-то находится, иначе не будет происходить дополнительное уточнение), а вогнутые тела могут захватиться неправильно. Но обе эти проблемы могут быть решены весьма умеренным сгущением базовой сетки, а уточнение контуров вогнутых тел я планирую рассмотреть в будущем.
Добавление трассировки линий к персонажу
Создаем новый проект. За основу берем «Blueprint» шаблон «ThirdPerson» со стартовым набором.
Переходим в папку Content/ThirdPersonBP/Blueprints и открываем Blueprint Class «ThirdPersonCharacter». Добавляем компонент «ProceduralMesh» и создаем переменные, которые понадобятся нам в дальнейшей работе.
Все переменные расположены в трех категориях:
— Base — параметры, определяющие размеры области видимости, ее расположение и детализацию;
— Auxiliary — переменные необходимые во время работы;
— Debug — параметры использующиеся при отладке проекта (не являются необходимыми, но сильно упрощаю жизнь).
Обратите внимание, что у переменных «Base» и «Debug» нужно включить «глазик», что позволит менять их в редакторе для каждого персонажа отдельно.
HalfAngle — половинный угол обзора
DeltaAngle — желаемый угол между базовыми (красными) линиями сетки
ExternalRadius — дальность видимости
bUseExternalPrecise — включает или отключает использование функции «PreciseExternalBorders», отвечающей за точное определение внешних границ объектов
PreciseAngle — угол, задающий точность определения границ объектов, при условии, что «bUseExternalPrecise » = «true»
HeightOfCheck — высота на которой проверяется наличие препятствий
HeightOfShow — высота на которой будет отрисовываться область видимости, являющаяся результатом проверки на высоте «HeightOfCheck»
NumberOfSections — Количество элементов базовой сетки (2*HalfAngle/DeltaAngle с округлением в большую сторону)
dAngle — реальный угол между базовыми (красными) линиями сетки (2*HalfAngle/NumberOfParts), может незначительно отличаться от «DeltaAngle»
StartPoint — координаты точки из которой стартуют лучи
HitResults — массив, состоящий из элементов типа «Hit Result», в которых содержатся результаты работы стандартной функции «LineTraceByChannel»
DrawDebugType — позволяет выбрать несколько режимов отрисовки лучей (тип «EDraw Debug Trace»)
DebugDrawTime — длительность отрисовки лучей
bRebuild — позволяет перезапустить «ConstructionScript»
PreciseCount — позволяет ограничить количество итераций в функции «BisectionMethod»
Во вкладке «ConstructionScript» (картинка сверху) создаем три блока. Блок 1 позволяет перезапустить «ConstructionScript» для конкретного персонажа при изменении значения переменной «bRebuild» из редактора, а в блоках 2 и 3 вызываем функции «Start» и «LineTracing», которые приводятся ниже.
Используется для задания начальных параметров, зависящих от параметров из категории «Base»
Из переменных «HeightOfCheck» и «HeightOfShow» вычитается «100» для того, чтобы значения этих переменных равные «0» соответствовали уровню пола.
Генерирует лучи в диапазоне углов от «-HalfAngle» до «HalfAngle», если считать от того направления куда смотрит персонаж (обозначим «ActorForwardVector»), с шагом по углу «dAngle» и записывает результаты трассировки в массив «HitResults».
Блок 1. Вычисляем угол между i-ым лучом и «ActorForwardVector».
(получить это направление можно с помощью функции «GetActorForwardVector»)
Блок 2. Задаем направление i-ого луча и его длину.
Блок 3. Делаем трассировку i-ого луча с помощью функции «LineTraceByChannel» и добавляем результат в массив «HitResults». По умолчанию до столкновения с каким-либо препятствием луч отображается красным, а после столкновения — зеленым.
Результат работы цикла
Блок 4. После завершения цикла запускаем функцию «CreateProceduralMesh».
Создает сетку, опираясь на массив «HitResults», который был получен в функции «LineTracing» и уточнен в функции «PreciseExternalBorders», если выбрана соответствующая опция.
Блок 1. Проверяет нужно ли использовать функцию «PreciseExternalBorders» для уточнения границ.
Блоки 2 и 3. Проверяют встретил ли луч какое-нибудь препятствие. Если не встретил, то для создания треугольника берется конец луча, а если встретил, то координата точки взаимодействия. Рассматриваются i-ый и i+1-ый лучи. Результаты записываются в «L_LeftPoint» и «L_RightPoint» соответственно.
Блок 4. Используя встроенную функцию «CreateMeshSection», создает треугольник и применяет к нему материал «MI_Base» (показан ниже). Функция «CreateMeshSection» использует относительные координаты, поэтому мы вычитаем вектор «StartPoint» из координат всех трех точек и отправляем массив из этих точек на вход «Vertices». На вход «Triangles» подается массив, каждые три элемента которого указывают из каких трех точек предыдущего массива нужно составлять очередной треугольник. Стоит обратить внимание на направление обхода, так как от этого зависит направление нормали, а следовательно, увидим ли мы наш треугольник.
Блок 5. Является следствием того, что функция «CreateMeshSection» использует относительные координаты, и из-за этого «ProceduralMesh» поворачивается в два раза быстрее персонажа. Поэтому приходится доворачивать ее назад.
Создаем материал «M_Base».
«BlendMode» устанавливаем на «Translucent» и добавляем параметр «BaseColor».
Создаем «Material Instance» под названием «MI_Base».
Сравнение результатов при разных значения «DeltaAngle» с уточнением границ и без уточнения
Так как мы уже подошли к моменту, когда нужно смотреть на получающиеся результаты при разных значения «DeltaAngle» без использования функции «PreciseExternalBorders», то я решил добавить сюда же и результаты с использованием этой функции. А саму функцию «PreciseExternalBorders» рассмотрим чуть позже.
Хочу обратить внимание на то, что граница тени для области с уточнением нисколько не изменила своего положения во всех трех случаях и по-прежнему существенно точнее чем граница области без уточнения, так как «PreciseAngle» равен «0,01°». Отличия можно увидеть на картинках ниже.
Если персонаж не двигается, то такие неточности несильно заметны с «большого» расстояния, но во время движения граница начинает заметно дергаться.
Стоит отметить, что для DeltaAngle = 20° и выбранных параметрах области возможна ситуация, когда на большой дистанции ни один из базовых лучей (красные линии) не попадет в куб, и поэтому положение границ уточняться не будет в любом случае, а следовательно, и куб не будет отбрасывать тень. Учитывая размеры области и кубов, можно сказать, что DeltaAngle = 10° и использование функции «PreciseExternalBorders» гарантировано позволят захватить куб, так как расстояние между концами базовых лучей всегда будет меньше, чем размеры куба.
Определяет соседние лучи, попадающие в разные объекты (также подходит вариант, когда один луч попадает в объект, а второй нет), и вызывает для них функцию «BisectionMethod», которая уточняет положение границ объектов методом половинного деления.
Блок 1. Добавляет i-ый элемент из массива «HitResults» в локальный массив «L_HitResults»
Блок 2. Определяет попадают ли i-ый и i+1-ый лучи в разные объекты.
Блок 3. Определяет точку, которая пойдет в функцию «BisectionMethod». Если луч попадает в объект, то берется координата точки взаимодействия, а если не попадает, то координата конца.
Блок 4. Вызывает функцию «BisectionMethod». Результаты ее работы (дополнительные лучи, определяющие уточненное положение границ) добавляются в массив «L_HitResults».
Блок 5. Обновляем массив «HitResults».
Уточняет положение границ объектов методом половинного деления.
Обозначения поясняются чуть ниже при описании локальных переменных.
«L_LeftDirection» — направление левого луча (L)
«L_RightDirection» — направление правого луча (R)
«L_StartPoint» — координаты точки из которой выходят лучи
«L_MidDirection» — биссектриса угла между правым и левым лучом (M)
«L_LeftActor» — объект, в который попал левый луч
«L_RightActor» — объект, в который попал правый луч
«L_CurrentAlpha» — текущий угол между правым и левым лучом (A)
«L_NewHits» — массив, в который добавляются результаты «попаданий» левого и правого луча, после того как угол между ними становится меньше, чем «PreciseAngle».
«L_OtherActors» — массив из объектов, которые оказались между объектами «L_LeftActor» и «L_RightActor»
Блок 1. Инициализирует необходимые локальные переменные
Блок 2. Сравнивает угол между левым и правым лучом с «PreciseAngle» и проверяет сколько прошло итераций
Блок 3. Определяет угол между левым и правым лучом
Блок 4. Определяет биссектрису угла между левым и правым лучом
Блок 5. Проводит трассировку луча, направленного по биссектрисе
Блок 6. Выбирает какой из лучей (левый или правый) нужно заменить на биссектрису и проверяет наличие других объектов между лучами
Блок 7. Определяет куда попадают лучи после того, как была достигнута нужная точность, и записывает результаты в массив «L_NewHits»
Блок 8. Проверяет остались ли еще дополнительные объекты между лучами, и если остались, то запускает девятый блок. Если же таких объектов нет, то функция завершает свою работу и возвращает список найденных границ («L_NewHits»).
Блок 9. Берет первый объект из дополнительных и запускает уточнение его границ (цикл while).
Схематичный пример наличия дополнительного объекта между лучами.
Сначала была найдена граница между пустотой и шаром (I), а потом — между шаром и треугольником (II).
Реальный пример. На левой картинке блоки 8 и 9 отключены, а на правой работают.
В данном случае между левой стеной и «углом» оказалась область с максимальной дальностью (ее видно на правой картинке в красном круге), что и привело к нежелательному результату на левой картинке. Конечно, в этом примере угол между базовыми лучами равнялся 30° и в такую область может попасть далеко не один дополнительный объект. Если же мы уменьшим угол между лучами, то шансы на наличие дополнительного объекта сильно упадут, хотя и останутся не нулевыми. Поэтому мы и делаем дополнительную проверку (блок 8).
Создаем функцию «Update», в которой обновляем переменную «StartPoint» и удаляем старые данные из «HitResults» и «ProceduralMesh».
Переходим во вкладку «EventGraph» и соединяем «EventTick» c функцией «Update» и «LineTracing».
Теперь область видимости готова.
Еле-еле уложился в отведенные 25 картинок. В будущем придется либо разбивать такие посты на пару частей, либо не вдаваться в излишние детали. Я больше склоняюсь ко второму варианту, так что если детали все-таки нужны, то напишите в комментариях.
В планах добавить уточнение контуров вогнутых тел и внести некоторые изменения в уточнение границ. Есть мысли по поводу того, чтобы разные части области видимости имели разные цвета, в зависимости от высоты объекта, который еще можно увидеть в данной точке. Также хочу постараться для все своих постов по «Blueprint»-ам делать второй вариант на C++.
Ссылки на видеоурок:
Создание области видимости с затенением. Часть 1.
Создание области видимости с затенением. Часть 2.
Найдены возможные дубликаты
Лига Разработчиков Видеоигр
4.2K пост 18.7K подписчика
Правила сообщества
— Уважайте чужой труд и используйте конструктивную критику
— Не занимайтесь саморекламой, пишите качественные и интересные посты
— Не употребляйте мат без необходимости
— Посты о Вашей игре с историей её разработки и описанием полученного опыта
— Обучающие материалы, туториалы
— Интервью с опытными разработчиками
— Анонсы бесплатных мероприятий для разработчиков и истории их посещения;
— Ваши работы, если Вы художник/композитор и хотите поделиться ими на безвозмездной основе
НЕ СТОИТ ПУБЛИКОВАТЬ:
— Только гифки/арты/скриншоты из игры. Такие материалы могут сопровождать рассказ об игре или обучающий туториал, но не должны являться основой поста
— Посты, содержащие только идею игры
— Посты, единственная цель которых — набор команды для разработки игры, для этих целей больше подойдёт Discord-сервер сообщества
— Посты, не относящиеся к тематике сообщества
Подобные посты по решению администрации могут быть перемещены из сообщества в общую ленту.
— Публиковать бессодержательные посты с рекламой Вашего проекта (см. следующий пункт), а также все прочие посты, содержащие рекламу/рекламные интеграции
— Выдавать чужой труд за свой
Подобные посты будут перемещены из сообщества в общую ленту, а их авторы по решению администрации могут быть внесены в игнор-лист сообщества.
Ссылка на сторонний ресурс, связанный с игрой, допускается только при следующих условиях:
— Пост должен быть содержательным и интересным для пользователей, нести пользу для сообщества
— Ссылка должна размещаться непосредственно в начале или конце поста и только один раз
— Cсылка размещается в формате: «Страница игры в Steam: URL»
«Блюпринты это просто, ты только посмотри на эти скриншоты» ))
1. За 2д/3д тебе тут уже прояснили, ты явно делаешь 2д систему, но зачем то демонстрируешь её в 3д. Из за этого к тебе появляется куча доп вопросов.
По идее, ты даже не систему видимости создаешь, а её визуализацию. И это скорей нужно решать через какой-нить stencil shader.
2. Данная система, с сектором круга определенного радиуса, подходит только для очень простых игр, типа «делаем с друганом симулятор ходьбы». В реальности же, тебя попросят сделать чуть более сложную фигуру, так так человеческое зрение так сильно не ограничивается. Ты можешь заметить боковым зрением движение в точке находящейся чуть ли не в 85 градусов от начального вектора. Но при этом же это боковое зрение очень интересно ограничивается по расстоянию в большинстве игр.
А в твоем случае, игрок может противнику в ухо дышать, стоя четко с боку, и противник его не заметит.
3. Производительность. Тебе выше уже посоветовали перейти к мешам, и это именно твой вариант, поверь. Ты можешь сделать их любой формы. И в результате не нужно прокидывать по куче рейкастов только чтобы заметить цель. Цель попала в коллайдер, ок, начинаем работать конкретно с её целевыми точками, чтобы понять видим мы её или нет. Лишнюю сотню другую рейкастов лучше потратить на что-нибудь более интересное.
Второй вариант решает часть проблем, но тоже далеко не все.
Какие проблемы не решает этот вариант? Давай разбираться.
Он сам все это делает, и даже для дебага все красиво отображает. Если прям в игре надо отображать область видимости, то это, конечно, другой вопрос, но наверняка из внутренностей UE4 можно вызвать тот же код руками и отображать все в игре
P.S.: но я все равно очень благодарен автору за посты. Приятно, что кто-то несет знание в массы, так держать.
Добрый день. Повторюсь еще раз. Что основная цель этого поста — это показать каие-то простые вещи, которые могут быть интересны тем, кто только начинает заниматься UE4. Это второй пост на данную тему, и в нем представлен промежуточный результат.
Да, эта область служит только для визуализации. И логичным решением будет использовать ее с AI Perception.
Другие формы области видимости и тому подобные вещи — это конкретные задачи, которые требует как минимум времени. И я не очень понимаю такие претензии.
Мешы я обязательно посмотрю, спасибо.
Проблемы которые не решает этот вариант:
я бы хотел, чтобы область отображалась поверх всех объектов, которые попали в конус, но цвет в каждой точке показывал бы «высоту» объекта, начиная с которой он будет замечен персонажем.
Решить эту проблему ты не можешь пока, потому как данной проблемы и нет на самом деле)
Повторюсь еще раз, но
ты делаешь 2д систему, но зачем то демонстрируешь её в 3д.
При этом ты начинаешь усложнять там, где это явно не требуется. И пытаешь отобразить в 2д, 3д обзор, придумывая велосипеды.
Для 3д (как и для 2д на самом деле), тебе важно знать саму зону где у противника технически есть возможность тебя увидеть.
А все остальные расчеты видимости-хуидимости, ты производишь только в момент когда игрок в эту самую зону попадает. А когда противник просто шарится по местности, тебе и не важно должно быть какой коэффициент видимости за той метровой стеной и в 20 см от неё. Потому как ты в любом случае обрабатываешь появление игрока в условном поле видимости, даже если он стоит за глухой стеной. А когда луч из условных глаз противника таки попадает в игрока, противник такой «ну он находится от меня на растоянии 25 метров, двигается он вроде не быстро, и я в вижу на нем амулет святого ниньзя, следовательно коэфф заметности у него около 0,65 и мне нужно потупить 3,4 секунды перед тем как поднять тревогу, ок, действуем». Визуализировать это все цветовыми грациентами ты заебешься)
Обычно когда кто-либо мастерит подобные системы в 3д, делаешь поле видимости, делаешь условных персонажей, ребенок/женщина/мужик, несколько условных действий, лежит/на кортах/стоит/двигается, расставляешь их за различными препятствиями, и условными коэфф 0..1 над каждым персонажем указываешь, как хорошо их видно в тех или иных ситуациях.
Но ты всегда можешь сказать, «а я хочу именно вот так», и продолжать это делать. Но.