Как динамически рендерить квадроциклы в UE4?

На answer.unrealengine.com есть несколько волнующихся ответов на этот вопрос, но в них, похоже, отсутствуют какие-либо подробности или примеры.

В частности, если вы хотите реализовать набор динамических текстурированных четырехугольников, которые визуализируются в трехмерном игровом мире, как бы вы это сделали?

В качестве варианта использования рассмотрите возможность бокового скроллера с двумя тарелками, который использует анимацию Spriter. 2D-анимации загружаются из XML достаточно легко, но как затем динамически визуализировать этот 2D-набор текстурированных, повернутых и масштабированных четырехугольников на сцене?


person Doug    schedule 14.04.2015    source источник
comment
Я думаю, вам нужно изучить процедурную статическую сетку и создание материалов. Кажется, это не очень хорошо подходит для API UE4, но вы можете начать с docs.unrealengine.com/latest/INT/API/Plugins/ и вики .unrealengine.com / Procedural_Materials   -  person vipw    schedule 24.04.2016
comment
@vipw О, я их читал ... Я просто не могу заставить их работать. Если у вас есть пример из них реально работающих, добро пожаловать на бонус в 200 баллов с истекшим сроком действия по этому вопросу.   -  person Doug    schedule 25.04.2016
comment
У меня что-то работает на основе этого кода: wiki.unrealengine.com/ Другой, более сложный пример: github.com/LaP0573/ue4 -fbx-importer / blob / master /   -  person vipw    schedule 12.05.2016


Ответы (1)


Проблема, с которой вы столкнулись, связана с созданием меша или с получением правильной ориентации? (т.е. ортогональная проекция, обращенная к камере)

Создание меша достаточно просто, может быть выполнено либо через Blueprints, либо в коде.

В Blueprints вы должны установить определенные предварительные условия, а затем выбрать создание актеров в зависимости от условий. Фактическое решение для кодирования будет выглядеть примерно так же.

Если это касается ориентации, то вам поможет следующий ответ, найденный на форумах UnrealEngine:

https://answers.unrealengine.com/questions/62126/how-do-i-render-a-dynamic-mesh-with-orthographic-p.html

РЕДАКТИРОВАТЬ:

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

ADynamicMeshSpawner::ADynamicMeshSpawner()
{
     // Set this actor to call Tick() every frame.  You can turn this off to improve performance if you don't need it.
     PrimaryActorTick.bCanEverTick = true;

    // Using a SphereComponent is not particularly necessary or relevant, but the cube refused to spawn without a root component to attach to, or so I surmise. Yay Unreal. =/
    USphereComponent* CubeComponent = CreateDefaultSubobject<USphereComponent>(TEXT("RootComponent"));
    RootComponent = CubeComponent;
    CubeComponent->InitSphereRadius(40.0f);
    CubeComponent->SetCollisionProfileName(TEXT("Pawn"));

    // Create and position a mesh component so we can see where our cube is
    UStaticMeshComponent* CubeVisual = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("VisualRepresentation"));
    CubeVisual->AttachTo(RootComponent);
    static ConstructorHelpers::FObjectFinder<UStaticMesh> SphereVisualAsset(TEXT("StaticMesh'/Game/StarterContent/Shapes/Shape_Cube.Shape_Cube'"));
    if (SphereVisualAsset.Succeeded())
    {
        CubeVisual->SetStaticMesh(SphereVisualAsset.Object);
        CubeVisual->SetRelativeLocation(FVector(-200.0f, 0.0f, 100.0f));
        CubeVisual->SetWorldScale3D(FVector(2.0f));
    }
    // Create a material to be applied on the StaticMeshComponent
    static ConstructorHelpers::FObjectFinder<UMaterial> Material(TEXT("Material'/Game/StarterContent/Materials/M_Tech_Hex_Tile_Pulse.M_Tech_Hex_Tile_Pulse'"));

    if (Material.Object != NULL)
    {
        TheMaterial = (UMaterial*)Material.Object;
    }

    CubeVisual->SetMaterial(0, TheMaterial);
}

Заголовочный файл выглядит так:

UCLASS()
class MYPROJECT_API ADynamicMeshSpawner : public AActor
{
    GENERATED_BODY()

public: 
    // Sets default values for this actor's properties
    ADynamicMeshSpawner();

    // Called when the game starts or when spawned
    virtual void BeginPlay() override;

    // Called every frame
    virtual void Tick( float DeltaSeconds ) override;
    // Pointer to the material that needs to be used
    UMaterial* TheMaterial;
};

Окончательный результат в редакторе выглядел так:

Великолепный куб, созданный из кода!

Я настроил его так, чтобы экземпляр моего класса DynamicMeshSpawner создавался каждый раз, когда я нажимаю «P» на клавиатуре. Когда создается экземпляр этого класса, он вызывает конструктор, который порождает куб с примененным материалом. Я создал материал для создания экземпляра класса в BluePrints, используя узел SpawnActor.

Реализовано в чертеже уровня

Условия, необходимые для создания материала, очевидно, будут зависеть от приложения.

Этот метод работает с обычными Материалами, но НЕ с Экземплярами Материалов. Я считаю, что вам придется внести изменения в тип TheMaterial, вызов ConstructorHelper и приведение ссылки на материал в TheMaterial, чтобы заставить его работать.

Я уверен, что это будет работать и с анимированными материалами, а это значит, что 2D-анимацию нужно будет преобразовать в какой-то материал.

Возможно, ссылка ниже поможет.

https://forums.unrealengine.com/showthread.php?6744-Flipbook-material-to-recreate-an-animated-gif

РЕДАКТИРОВАТЬ 2:

Ниже приведен очень хороший набор примеров процедурного создания объектов в Unreal. Оставив его здесь для потомков и на случай, если кто-нибудь придет посмотреть.

https://github.com/SiggiG/ProceduralMeshes/

person Sai Narayan    schedule 30.12.2015
comment
Как я уже сказал в вопросе: «На сайте answers.unrealengine.com есть несколько волнующихся ответов на этот вопрос, но, похоже, в них отсутствуют какие-либо детали или примеры». Я хочу очень-очень просто: процедурно создать четырехугольник (во время выполнения) и визуализировать на нем текстуру (выбранную во время выполнения). Вот и все. Это не расплывчатый вопрос; и, к сожалению, ссылка, на которую вы указали, - это как раз тот тип «расплывчатого махания рукой», о котором я говорю. Я с радостью приму любой ответ, который действительно показывает код того, как это сделать. - person Doug; 30.12.2015
comment
Справедливый пункт Дуг. Приносим извинения за неясность. Меня довольно раздражает отсутствие документации или примеров для чего-то, что должно быть довольно легко реализовать. Дайте мне немного, я сам стараюсь реализовать это и скоро вернусь к вам. - person Sai Narayan; 30.12.2015
comment
Опубликовал реализацию, которая у меня сработала. Я заметил, что вы просили выбрать текстуру во время выполнения. Я почти уверен, что реализовать такую ​​функцию будет непросто. Это потребует предварительного преобразования всех текстур в Материалы (перед запуском) и их сохранения в какой-либо структуре данных. Массив был бы самым простым. Затем этот массив (например) должен быть доступен для индексации во время выполнения. Предварительные условия вызовут порождение разных квадроциклов с разными материалами (текстурами), отрендеренными на них. Не невозможно, но и не так просто. - person Sai Narayan; 30.12.2015
comment
Это отличная попытка ответить на вопрос, и, безусловно, самая близкая из тех, что я когда-либо видел, чтобы сделать это успешно; но обратите внимание, что вы не создаете ни геометрию процедурно (вы просто используете компонент куба), ни материал (вы просто загружаете существующий материал). Вот в чем проблема; геометрия спрайтера не фиксируется; каждая анимация в нем имеет свой набор четырехугольников, и геометрия, активная в конкретной анимации, может фактически изменяться в ходе анимации, когда вы нажимаете ключевые кадры; так что в конечном итоге я, к сожалению, еще не приблизился к решению. - person Doug; 31.12.2015
comment
Вот дерьмо. = / Я считаю, что вы тут как раз на гвозде. Но, проявив немного настойчивости и немного поработав, я верю, что смогу это осуществить! Я признаю, что теперь это стало чем-то вроде навязчивой идеи. Мне нужно решить эту проблему! Дуг, я либо решу это, либо умру, пытаясь. Пожелай мне удачи. - person Sai Narayan; 31.12.2015