Горячее
Лучшее
Свежее
Подписки
Сообщества
Блоги
Эксперты
Войти
Забыли пароль?
или продолжите с
Создать аккаунт
Я хочу получать рассылки с лучшими постами за неделю
или
Восстановление пароля
Восстановление пароля
Получить код в Telegram
Войти с Яндекс ID Войти через VK ID
Создавая аккаунт, я соглашаюсь с правилами Пикабу и даю согласие на обработку персональных данных.
ПромокодыРаботаКурсыРекламаИгрыПополнение Steam
Пикабу Игры +1000 бесплатных онлайн игр
Поднимайтесь как можно выше по дереву, собирайте цветы и дарите их близким.
Вас ждут уникальные награды и 22 выгодных промокода!

Пикаджамп

Аркады, Казуальные, На ловкость

Играть

Топ прошлой недели

  • Oskanov Oskanov 8 постов
  • alekseyJHL alekseyJHL 6 постов
  • XpyMy XpyMy 1 пост
Посмотреть весь топ

Лучшие посты недели

Рассылка Пикабу: отправляем самые рейтинговые материалы за 7 дней 🔥

Нажимая кнопку «Подписаться на рассылку», я соглашаюсь с Правилами Пикабу и даю согласие на обработку персональных данных.

Спасибо, что подписались!
Пожалуйста, проверьте почту 😊

Новости Пикабу Помощь Кодекс Пикабу Реклама О компании
Команда Пикабу Награды Контакты О проекте Зал славы
Промокоды Скидки Работа Курсы Блоги
Купоны Biggeek Купоны AliExpress Купоны М.Видео Купоны YandexTravel Купоны Lamoda
Мобильное приложение

Tuturial

5 постов сначала свежее
2
aie24.ru
aie24.ru
4 года назад

Модифицируем калькулятор на JavaScript⁠⁠

Модифицируем калькулятор на JavaScript Javascript, Калькулятор, Tuturial, Код, HTML

JavaScript калькулятор (v2)

Мы уже разбирались, Как написать калькулятор на JavaScript , пришло время сделать небольшой апгрейд. Поехали.

Немного усовершенствуем разметку. Ничего глобального, просто у всех элементов option изменим атрибут value, да и текст внутри тоже заменим.

Модифицируем калькулятор на JavaScript Javascript, Калькулятор, Tuturial, Код, HTML

Переменные оставим без изменений.

Модифицируем калькулятор на JavaScript Javascript, Калькулятор, Tuturial, Код, HTML

Запускаем событийную функцию. Которая при клике на кнопку, определяет в каком положении находится наш select и передает value функции calcForm.

Модифицируем калькулятор на JavaScript Javascript, Калькулятор, Tuturial, Код, HTML

Что же представляет из себя функция calcForm? А вот что.

Модифицируем калькулятор на JavaScript Javascript, Калькулятор, Tuturial, Код, HTML

Осталось доработать поведение кнопки, что бы она становилась активной при изменении значения в полях или выборе оператора.

Модифицируем калькулятор на JavaScript Javascript, Калькулятор, Tuturial, Код, HTML
Показать полностью 5
[моё] Javascript Калькулятор Tuturial Код HTML
1
TheBrainMO
TheBrainMO
4 года назад
LEGO

LEGO SWAG Glasses Tutorial(Instructions)⁠⁠

Всем привет народ! Сильно тапками не кидать в меня😊

Сделал модные очки😎

[моё] LEGO Tuturial Инструкция Видеоблог Видео Конструктор Хобби
6
25
SkorAU
5 лет назад
Лига Разработчиков Видеоигр

Создание простой области видимости (C++) [UE4]⁠⁠

Создание простой области видимости (C++) [UE4] Unreal Engine 4, Tuturial, Видео, Длиннопост

Добрый день. Это второй мой пост на тему создания простой области видимости. И он тесно связан с первым постом, так как конечный результат будет точно таким же как и там. Только получим мы этот результат с помощью C++. Если какие-то детали разобраны недостаточно подробно, то в конце поста есть ссылка на видеоурок.


Создание проекта

За основу возьмем шаблон "ThirdPerson" со стартовым набором. Тип проекта выберем "С++" и назовем его "SimpleVisionAreaCPP" (это название влияет на названия C++ классов, которые создаются автоматически). В папке "Content" создаем рабочую папку "MyContent", а в ней папки "BP" и "Materials".


Создание материала

Переходим в папку "Materials". Создаем новый материал и называем его "M_VisionArea". 

Создание простой области видимости (C++) [UE4] Unreal Engine 4, Tuturial, Видео, Длиннопост

Процесс создания этого материала подробно описан в первом посте.

Назначение параметров:

"ExternalRadius" - отвечает за дальность видимости (внешний радиус)

"InternalRadius" - отвечает за область около персонажа (внутренний радиус)

"Density" - отвечает за размытость границ

"HalfAngle" - отвечает за угол обзора (половинный угол)


В дальнейшем нам понадобится DecalMaterial, поэтому создадим копию нашего материала и назовем ее "M_DecalVisionArea". Откроем этот материал и изменим "Material Domain" с "Surface" на "Deferred Decal".


Настройка персонажа

Переходим в папку "C++ Classes"/"SimpleVisionAreaCPP", выбираем С++ класс "SimpleVisionAreaCPPCharacter", нажимаем на него правой кнопкой мыши и создаем производный C++ класс. И называем его "MyCharacter".

Создание простой области видимости (C++) [UE4] Unreal Engine 4, Tuturial, Видео, Длиннопост

Переходим в папку "BP" и создаем новый "Blueprint Class" (в качестве родителя выбираем только что созданный C++ класс "MyCharacter"). Называем его "BP_MyCharacter" и помещаем на сцену.

Создание простой области видимости (C++) [UE4] Unreal Engine 4, Tuturial, Видео, Длиннопост

Сейчас в "BP_MyCharacter" не выбраны "Skeletal Mesh" и "Anim Class" (анимация).

Создание простой области видимости (C++) [UE4] Unreal Engine 4, Tuturial, Видео, Длиннопост

Создаем конструктор класса. Для этого в заголовочный файл "MyCharacter.h" добавляем строчки:

public:
AMyCharacter();
а в cpp файл "MyCharacter.cpp" добавляем два заголовочных файла:
#include "Components/SkeletalMeshComponent.h"
#include "UObject/ConstructorHelpers.h"
Создаем переменную CharacterMesh:
USkeletalMeshComponent* CharacterMesh = GetMesh();

И используем метод "GetMesh", для того чтобы получить "Mesh" (SkeletalMeshComponent) из "BP_MyCharacter" (выделен желтым на предыдущем рисунке). Ищем "SkeletalMesh" при помощи "ConstructorHelpers::FObjectFinder":

static ConstructorHelpers::FObjectFinder <USkeletalMesh> SkeletalMeshHelper(TEXT("SkeletalMesh'/Game/Mannequin/Character/Mesh/SK_Mannequin.SK_Mannequin'"));

Путь "SkeletalMesh'/Game/Mannequin/Character/Mesh/SK_Mannequin.SK_Mannequin'" можно получить, если выбрать интересующий нас объект в "Content Browser", щелкнуть по нему правой кнопкой мыши и выбрать "Copy Reference".

Создание простой области видимости (C++) [UE4] Unreal Engine 4, Tuturial, Видео, Длиннопост

Если не знаете где расположен нужный объект, но знаете "Bluprint Class", где он используется, то можете перейти в этот класс и воспользоваться лупой.

Создание простой области видимости (C++) [UE4] Unreal Engine 4, Tuturial, Видео, Длиннопост

После этого в "Content Browser" будет открыта папка с нужным объектом, а сам объект будет выделен.

Проверяем, удалось ли найти нужный объект. И если удалось, то применяем его:

if (SkeletalMeshHelper.Object) {
CharacterMesh->SetSkeletalMesh(SkeletalMeshHelper.Object);
}
Перемещаем и поворачиваем наш манекен так, чтобы ноги у него находились на уровне пола, а смотрел он в сторону оси "X":
CharacterMesh->SetRelativeLocation(FVector(0.0, 0.0, -97.0));
CharacterMesh->SetRelativeRotation(FRotator(0.0, 270.0, 0.0));

По аналогии со "SkeletalMesh"  добавляем анимацию:

static ConstructorHelpers::FClassFinder <UAnimInstance> AnimInstanceHelper(TEXT("AnimBlueprint'/Game/Mannequin/Animations/ThirdPerson_AnimBP.ThirdPerson_AnimBP_C'"));
if (AnimInstanceHelper.Class) {
CharacterMesh->SetAnimInstanceClass(AnimInstanceHelper.Class);
}
Только в этот раз мы ищем не объект, а класс. Поэтому к пути, который получается с помощью  "Copy Reference": нужно дописать "_C".

После сборки проекта у нас получается вот такой "BP_MyCharacter":

Создание простой области видимости (C++) [UE4] Unreal Engine 4, Tuturial, Видео, Длиннопост

На этом настройка персонажа закончена. Давайте теперь добавим область видимости.


Добавление области видимости к персонажу

Добавляем в заголовочный файл две переменные:

UPROPERTY(EditDefaultsOnly, BlueprintReadWrite, Category = "VisionArea|Components")
UStaticMeshComponent* VisionArea_SMC;
UPROPERTY(EditDefaultsOnly, BlueprintReadWrite, Category = "VisionArea|Components")
UMaterial* VisonArea_Material;
В "StaticMeshComponent" мы поместим плоскость, а переменная "VisonArea_Material" позволит выбрать материал, который будет использоваться для отображения области видимости.


В cpp файле создаем дефолтный "StaticMeshComponent" и называем его "VisionArea_SMC" (это имя будет отображаться редакторе).

VisionArea_SMC = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("VisionArea_SMC"));

Прикрепляем его к корневому компоненту, перемещаем на уровень пола и отключаем столкновения:

VisionArea_SMC->SetupAttachment(RootComponent);
VisionArea_SMC->SetRelativeLocation(FVector(0.0, 0.0, -95.0));
VisionArea_SMC->SetCollisionEnabled(ECollisionEnabled::NoCollision);
Ищем плоскость. И если удалось найти, то используем ее.
static ConstructorHelpers::FObjectFinder <UStaticMesh> PlaneHelper(TEXT("StaticMesh'/Engine/BasicShapes/Plane.Plane'"));
if (PlaneHelper.Object)
{
VisionArea_SMC->SetStaticMesh(PlaneHelper.Object);
}
Аналогично поступаем с материалом:
VisonArea_Material = CreateDefaultSubobject<UMaterial>(TEXT("VisonArea_Material"));
static ConstructorHelpers::FObjectFinder <UMaterial>MaterialHelper(TEXT("Material'/Game/MyContent/Materials/M_VisionArea.M_VisionArea'"));
if (MaterialHelper.Object)
{
VisonArea_Material = MaterialHelper.Object;
}

Для того чтобы у нас была возможность регулировать размеры области видимости, добавляем в заголовочный файл четыре переменные, которые позволят регулировать угол обзора, внешний и внутренний радиусы, а также цвет и прозрачность материала:

UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "VisionArea|Base")
float HalfAngle = 30.0;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "VisionArea|Base")
float ExternalRadius = 1000.0;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "VisionArea|Base")
float InternalRadius = 50.0;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "VisionArea|Base")
FLinearColor BaseColor = FLinearColor(0.0, 1.0, 0.0, 1.0);
Также нам понадобится переменная "VisionArea_DMI", отвечающая за динамический материал,
UMaterialInstanceDynamic* VisionArea_DMI;

и функция "OnConstruction", которая будет служить заменой функции "ConstructionScript" из Blueprint:

virtual void OnConstruction(const FTransform& Transform) override;

Переходим в cpp файл, создаем "MaterialInstanceDynamic", используя "VisonArea_Material", и связываем наши переменные с параметрами материала. Все это делаем внутри функции  "OnConstruction":

void AMyCharacter::OnConstruction(const FTransform& Transform) {
//----------------VisionArea_SMC-------------------//
float Scale = ExternalRadius / 50.0;
VisionArea_SMC->SetRelativeScale3D(FVector(Scale, Scale, 1.0));
VisionArea_DMI = UMaterialInstanceDynamic::Create(VisonArea_Material, nullptr);
VisionArea_DMI->SetVectorParameterValue(FName("BaseColor"), BaseColor);
VisionArea_DMI->SetScalarParameterValue(FName("HalfAngle"), HalfAngle);
VisionArea_DMI->SetScalarParameterValue(FName("InternalRadius"), 0.5 * InternalRadius / ExternalRadius);
VisionArea_SMC->SetMaterial(0, VisionArea_DMI);
}

"BP_MyCharacter" после сборки проекта:

Создание простой области видимости (C++) [UE4] Unreal Engine 4, Tuturial, Видео, Длиннопост

Давайте теперь добавим возможность использовать "DecalMaterial". Для этого добавляем в заголовочный фал две переменные, отвечающие за "DecalComponent" и "DecalMaterial" :

UPROPERTY(EditDefaultsOnly, BlueprintReadWrite, Category = "VisionArea|Components")
UDecalComponent* VisionArea_DC;
UPROPERTY(EditDefaultsOnly, BlueprintReadWrite, Category = "VisionArea|Components")
UMaterial* VisionArea_DecalMaterial;
а также переменную "UseDecal", которая позволить переключаться между "StaticMeshComponent" и "DecalComponent" (менять тип области):
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "VisionArea|Base")
bool UseDecal;
Переходим в cpp файл и добавляем заголовочные файлы:
#include "Materials/MaterialInstanceDynamic.h"
#include "Components/DecalComponent.h"

В функцию "OnConstruction" (по аналогии с "VisionArea_SMC" ) добавляем следующий код:

//---------------VisionArea_Decal-------------------//
float DecalScale = ExternalRadius / 256.0;
VisionArea_DC->SetRelativeScale3D(FVector(10.0, DecalScale, DecalScale));
VisionArea_DMI = UMaterialInstanceDynamic::Create(VisionArea_DecalMaterial, nullptr);
VisionArea_DMI->SetVectorParameterValue(FName("BaseColor"), BaseColor);
VisionArea_DMI->SetScalarParameterValue(FName("HalfAngle"), HalfAngle);
VisionArea_DMI->SetScalarParameterValue(FName("InternalRadius"), 0.5 * InternalRadius / ExternalRadius);
VisionArea_DC->SetMaterial(0, VisionArea_DMI);
а также устанавливаем видимость для "VisionArea_SMC" и "VisionArea_DC":
VisionArea_SMC->SetVisibility(!UseDecal);
VisionArea_DC->SetVisibility(UseDecal);

Осталось только собрать проект.


Заключение

Хотел добавить итоговый вариант заголовочного и cpp файлов в заключение. Но добиться нормального форматирования текста на pikabu  у меня не получается, поэтому полный текст "MyCharacter.h" и "MyCharacter.cpp" я добавлю в комментарии. Может быть кому-то пригодится.


Ссылка на видеоурок:

https://youtu.be/i6vs5tC_uCQ

Показать полностью 8 1
[моё] Unreal Engine 4 Tuturial Видео Длиннопост
2
58
SkorAU
5 лет назад
Лига Разработчиков Видеоигр

Создание области видимости с затенением [UE4]⁠⁠

Создание области видимости с затенением [UE4] Unreal Engine 4, Tuturial, Гифка, Видео, Длиннопост

Добрый день! Первый мой пост собрал больше двухсот лайков и два десятка подписчиков. Поэтому, как и обещал, делаю второй пост про создание области видимости с затенением.

Если кому-то удобнее смотреть видео или какие-то детали разобраны недостаточно подробно, то в конце поста есть ссылка на видеоурок (состоит из двух частей).


Введение

В данном примере мы будем использовать процедурную сетку и трассировку линий. А для того чтобы избежать лишнего использования ресурсов и не создавать избыточные элементы сетки, напишем, основываясь на методе половинного деления, функцию, которая будет уточнять положение границ объектов. На картинке выше красным показаны базовые линии сетки (в данном примере их всего 4 на область видимости с углом 90 градусов), а синим — линии сетки, которые образовались после уточнения границ (их 10, так как для каждой границы создается две линии). И этого хватило чтобы правильно отрисовать тени.


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


Добавление трассировки линий к персонажу

Создаем новый проект. За основу берем "Blueprint" шаблон "ThirdPerson" со стартовым набором.

Переходим в папку Content/ThirdPersonBP/Blueprints и открываем Blueprint Class "ThirdPersonCharacter". Добавляем компонент "ProceduralMesh" и создаем переменные, которые понадобятся нам в дальнейшей работе.

Создание области видимости с затенением [UE4] Unreal Engine 4, Tuturial, Гифка, Видео, Длиннопост

Все переменные расположены в трех категориях:

- Base - параметры, определяющие размеры области видимости, ее расположение и детализацию;

- Auxiliary - переменные необходимые во время работы;

- Debug - параметры использующиеся при отладке проекта (не являются необходимыми, но сильно упрощаю жизнь).

Обратите внимание, что у переменных "Base" и "Debug" нужно включить "глазик", что позволит менять их в редакторе для каждого персонажа отдельно.


Base

HalfAngle - половинный угол обзора

DeltaAngle - желаемый угол между базовыми (красными) линиями сетки

ExternalRadius - дальность видимости

bUseExternalPrecise - включает или отключает использование функции "PreciseExternalBorders", отвечающей за точное определение внешних границ объектов

PreciseAngle - угол, задающий точность определения границ объектов, при условии, что "bUseExternalPrecise " = "true"

HeightOfCheck - высота на которой проверяется наличие препятствий

HeightOfShow - высота на которой будет отрисовываться область видимости, являющаяся результатом проверки на высоте "HeightOfCheck"


Auxiliary

NumberOfSections - Количество элементов базовой сетки (2*HalfAngle/DeltaAngle с округлением в большую сторону)

dAngle - реальный угол между базовыми (красными) линиями сетки (2*HalfAngle/NumberOfParts), может незначительно отличаться от "DeltaAngle"

StartPoint - координаты точки из которой стартуют лучи

HitResults - массив, состоящий из элементов типа "Hit Result", в которых содержатся результаты работы стандартной функции "LineTraceByChannel"


Debug

DrawDebugType - позволяет выбрать несколько режимов отрисовки лучей (тип "EDraw Debug Trace")

DebugDrawTime - длительность отрисовки лучей

bRebuild - позволяет перезапустить "ConstructionScript"

PreciseCount - позволяет ограничить количество итераций в функции "BisectionMethod"



ConstructionScript

Во вкладке "ConstructionScript" (картинка сверху) создаем три блока. Блок 1 позволяет перезапустить "ConstructionScript" для конкретного персонажа при изменении значения переменной "bRebuild" из редактора, а в блоках 2 и 3 вызываем функции "Start" и "LineTracing", которые приводятся ниже.


Функция "Start"

Используется для задания начальных параметров, зависящих от параметров из категории "Base"

Создание области видимости с затенением [UE4] Unreal Engine 4, Tuturial, Гифка, Видео, Длиннопост

Из переменных "HeightOfCheck" и "HeightOfShow" вычитается "100" для того, чтобы значения этих переменных равные "0" соответствовали уровню пола.


Функция "LineTracing"

Генерирует лучи в диапазоне углов от "-HalfAngle" до "HalfAngle", если считать от того направления куда смотрит персонаж (обозначим "ActorForwardVector"), с шагом по углу "dAngle" и записывает результаты трассировки в массив "HitResults".

Создание области видимости с затенением [UE4] Unreal Engine 4, Tuturial, Гифка, Видео, Длиннопост

Блок 1. Вычисляем угол между i-ым лучом и "ActorForwardVector".

(получить это направление можно с помощью функции "GetActorForwardVector")

Блок 2. Задаем направление i-ого луча и его длину.

Блок 3. Делаем трассировку i-ого луча с помощью функции "LineTraceByChannel" и добавляем результат в массив "HitResults". По умолчанию до столкновения с каким-либо препятствием луч отображается красным, а после столкновения — зеленым.

Результат работы цикла

Создание области видимости с затенением [UE4] Unreal Engine 4, Tuturial, Гифка, Видео, Длиннопост

Блок 4. После завершения цикла запускаем функцию "CreateProceduralMesh".


Функция "CreateProceduralMesh"

Создает сетку, опираясь на массив "HitResults", который был получен в функции "LineTracing" и уточнен в функции "PreciseExternalBorders", если выбрана соответствующая опция.

Создание области видимости с затенением [UE4] Unreal Engine 4, Tuturial, Гифка, Видео, Длиннопост

Блок 1. Проверяет нужно ли использовать функцию "PreciseExternalBorders" для уточнения границ.

Блоки 2 и 3. Проверяют встретил ли луч какое-нибудь препятствие. Если не встретил, то для создания треугольника берется конец луча, а если встретил, то координата точки взаимодействия. Рассматриваются i-ый и i+1-ый лучи. Результаты записываются в "L_LeftPoint" и "L_RightPoint" соответственно.

Блок 4. Используя встроенную функцию "CreateMeshSection", создает треугольник и применяет к нему материал "MI_Base" (показан ниже). Функция "CreateMeshSection" использует относительные координаты, поэтому мы вычитаем вектор "StartPoint" из координат всех трех точек и отправляем массив из этих точек на вход "Vertices". На вход "Triangles" подается массив, каждые три элемента которого указывают из каких трех точек предыдущего массива нужно составлять очередной треугольник. Стоит обратить внимание на направление обхода, так как от этого зависит направление нормали, а следовательно, увидим ли мы наш треугольник.

Блок 5. Является следствием того, что функция "CreateMeshSection" использует относительные координаты, и из-за этого "ProceduralMesh" поворачивается в два раза быстрее персонажа. Поэтому приходится доворачивать ее назад.


Материал "MI_Base"

Создаем материал "M_Base".

"BlendMode" устанавливаем на "Translucent" и добавляем параметр "BaseColor".

Создание области видимости с затенением [UE4] Unreal Engine 4, Tuturial, Гифка, Видео, Длиннопост

Создаем "Material Instance" под названием "MI_Base".


Сравнение результатов при разных значения "DeltaAngle" с уточнением границ и без уточнения

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

Создание области видимости с затенением [UE4] Unreal Engine 4, Tuturial, Гифка, Видео, Длиннопост
Создание области видимости с затенением [UE4] Unreal Engine 4, Tuturial, Гифка, Видео, Длиннопост
Создание области видимости с затенением [UE4] Unreal Engine 4, Tuturial, Гифка, Видео, Длиннопост

Хочу обратить внимание на то, что граница тени для области с уточнением нисколько не изменила своего положения во всех трех случаях и по-прежнему существенно точнее чем граница области без уточнения, так как "PreciseAngle" равен "0,01°". Отличия можно увидеть на картинках ниже.

Создание области видимости с затенением [UE4] Unreal Engine 4, Tuturial, Гифка, Видео, Длиннопост
Создание области видимости с затенением [UE4] Unreal Engine 4, Tuturial, Гифка, Видео, Длиннопост

Если персонаж не двигается, то такие неточности несильно заметны с "большого" расстояния, но во время движения граница начинает заметно дергаться.

Создание области видимости с затенением [UE4] Unreal Engine 4, Tuturial, Гифка, Видео, Длиннопост
Создание области видимости с затенением [UE4] Unreal Engine 4, Tuturial, Гифка, Видео, Длиннопост
Создание области видимости с затенением [UE4] Unreal Engine 4, Tuturial, Гифка, Видео, Длиннопост
Создание области видимости с затенением [UE4] Unreal Engine 4, Tuturial, Гифка, Видео, Длиннопост

Стоит отметить, что для DeltaAngle = 20° и выбранных параметрах области возможна ситуация, когда на большой дистанции ни один из базовых лучей (красные линии) не попадет в куб, и поэтому положение границ уточняться не будет в любом случае, а следовательно, и куб не будет отбрасывать тень. Учитывая размеры области и кубов, можно сказать, что DeltaAngle = 10° и использование функции "PreciseExternalBorders" гарантировано позволят захватить куб, так как расстояние между концами базовых лучей всегда будет меньше, чем размеры куба.


Функция "PreciseExternalBorders"

Определяет соседние лучи, попадающие в разные объекты (также подходит вариант, когда один луч попадает в объект, а второй нет), и вызывает для них функцию "BisectionMethod", которая уточняет положение границ объектов методом половинного деления.

Создание области видимости с затенением [UE4] Unreal Engine 4, Tuturial, Гифка, Видео, Длиннопост

Блок 1. Добавляет i-ый элемент из массива "HitResults" в локальный массив "L_HitResults"

Блок 2. Определяет попадают ли i-ый и i+1-ый лучи в разные объекты.

Блок 3. Определяет точку, которая пойдет в функцию "BisectionMethod". Если луч попадает в объект, то берется координата точки взаимодействия, а если не попадает, то координата конца.

Блок 4. Вызывает функцию "BisectionMethod". Результаты ее работы (дополнительные лучи, определяющие уточненное положение границ) добавляются в массив "L_HitResults".

Блок 5. Обновляем массив "HitResults".


Функция "BisectionMethod"

Уточняет положение границ объектов методом половинного деления.

Создание области видимости с затенением [UE4] Unreal Engine 4, Tuturial, Гифка, Видео, Длиннопост

Обозначения поясняются чуть ниже при описании локальных переменных.

Создание области видимости с затенением [UE4] Unreal Engine 4, Tuturial, Гифка, Видео, Длиннопост
Создание области видимости с затенением [UE4] Unreal Engine 4, Tuturial, Гифка, Видео, Длиннопост

Локальные переменные:

"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).


Схематичный пример наличия дополнительного объекта между лучами.

Создание области видимости с затенением [UE4] Unreal Engine 4, Tuturial, Гифка, Видео, Длиннопост

Сначала была найдена граница между пустотой и шаром (I), а потом — между шаром и треугольником (II).


Реальный пример. На левой картинке блоки 8 и 9 отключены, а на правой работают.

Создание области видимости с затенением [UE4] Unreal Engine 4, Tuturial, Гифка, Видео, Длиннопост

В данном случае между левой стеной и "углом" оказалась область с максимальной дальностью (ее видно на правой картинке в красном круге), что и привело к нежелательному результату на левой картинке. Конечно, в этом примере угол между базовыми лучами равнялся 30° и в такую область может попасть далеко не один дополнительный объект. Если же мы уменьшим угол между лучами, то шансы на наличие дополнительного объекта сильно упадут, хотя и останутся не нулевыми. Поэтому мы и делаем дополнительную проверку (блок 8).


Последние приготовления

Создаем функцию "Update", в которой обновляем переменную "StartPoint" и удаляем старые данные из "HitResults" и "ProceduralMesh".

Переходим во вкладку "EventGraph" и соединяем "EventTick" c функцией "Update" и "LineTracing".

Создание области видимости с затенением [UE4] Unreal Engine 4, Tuturial, Гифка, Видео, Длиннопост

Теперь область видимости готова.


Заключение

Еле-еле уложился в отведенные 25 картинок. В будущем придется либо разбивать такие посты на пару частей, либо не вдаваться в излишние детали. Я больше склоняюсь ко второму варианту, так что если детали все-таки нужны, то напишите в комментариях.


В планах добавить уточнение контуров вогнутых тел и внести некоторые изменения в уточнение границ. Есть мысли по поводу того, чтобы разные части области видимости имели разные цвета, в зависимости от высоты объекта, который еще можно увидеть в данной точке. Также хочу постараться для все своих постов по "Blueprint"-ам делать второй вариант на C++.



Ссылки на видеоурок:

Создание области видимости с затенением. Часть 1.

Создание области видимости с затенением. Часть 2.

Показать полностью 22 2
[моё] Unreal Engine 4 Tuturial Гифка Видео Длиннопост
15
10
0sennijLis
0sennijLis
8 лет назад
Лига Сисадминов

Основы ITSM⁠⁠

Интересное и полезное видео для молодых и опытных руководителей ИТ подразделений еще не знакомых с библиотекой ITIL. Тем, кто хорошо знаком с практиками из данной библиотеки, также будет полезно посмотреть, так как автор (на мой взгляд) понятнее чем на многих других ресурсах объясняет основные понятия ITSM и их работу. Надеюсь оно окажется кому-то полезным.

Видеоуроки Tuturial Itil Itsm Helpdesk Видео
2
Посты не найдены
О Нас
О Пикабу
Контакты
Реклама
Сообщить об ошибке
Сообщить о нарушении законодательства
Отзывы и предложения
Новости Пикабу
RSS
Информация
Помощь
Кодекс Пикабу
Награды
Команда Пикабу
Бан-лист
Конфиденциальность
Правила соцсети
О рекомендациях
Наши проекты
Блоги
Работа
Промокоды
Игры
Скидки
Курсы
Зал славы
Mobile
Мобильное приложение
Партнёры
Промокоды Biggeek
Промокоды Маркет Деливери
Промокоды Яндекс Путешествия
Промокоды М.Видео
Промокоды в Ленте Онлайн
Промокоды Тефаль
Промокоды Сбермаркет
Промокоды Спортмастер
Постила
Футбол сегодня
На информационном ресурсе Pikabu.ru применяются рекомендательные технологии