【问题标题】:How do you dynamically render quads in UE4?如何在 UE4 中动态渲染四边形?
【发布时间】:2015-06-20 02:29:31
【问题描述】:

answers.unrealengine.com 上有一些关于此的手摇答案,但它们似乎缺乏任何细节或示例。

具体来说,如果你想实现一组在 3d 游戏世界中渲染的动态纹理四边形,你会怎么做?

对于用例,请考虑使用 Spriter 动画的 2dish 侧滚动条。从 XML 加载 2D 动画很容易,但是如何在场景中动态渲染这组 2D 纹理、旋转和缩放的四边形?

【问题讨论】:

标签: unreal-engine4


【解决方案1】:

您面临的问题是生成网格还是获得正确的方向? (即正交投影,面向相机)

生成网格很容易,可以通过蓝图或代码来完成。

在蓝图中,您将设置某些先决条件,然后根据条件选择生成 Actor。 实际的编码解决方案看起来差不多。

如果是关于方向,那么这个答案将对你有所帮助,在 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;
};

编辑器中的最终输出如下所示:

我对其进行了设置,以便每次我在键盘上按“P”时都会生成我的类“DynamicMeshSpawner”的实例。创建此类的实例时,它会调用构造函数,该构造函数会生成应用了材质的立方体。我使用 SpawnActor 节点在 BluePrints 中生成了类实例。

生成东西所需的条件显然取决于应用程序。

此方法适用于普通材质,但不适用于材质实例。我相信您必须更改 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/

【讨论】:

  • 就像我在问题中所说的那样:'在 answers.unrealengine.com 上有一些手摇的答案,但他们似乎缺乏任何细节或例子。'。我想要的非常非常简单:程序地创建一个四边形(在运行时)并在其上渲染一个纹理(在运行时选择)。而已。这不是一个模糊的问题。不幸的是,您链接到的链接正是我所说的那种“模糊的挥手”。我很乐意接受任何实际显示代码如何做到这一点的答案。
  • 公平点道格。为造成含糊不清而道歉。对于应该很容易实现的东西缺乏文档或示例,我对此感到非常恼火。给我一点,我正在尝试自己实现这个,很快就会回复你。
  • 发布了对我有用的实现。我注意到您要求在运行时选择纹理。我相当确定这样的功能不会很容易实现。它需要预先(在运行之前)将所有纹理转换为材质,并存储在某种数据结构中。数组将是最简单的。然后,该数组(例如)需要在运行时可用于索引。前提条件将触发生成不同的四边形,并在其上渲染不同的材质(纹理)。不是不可能,但也不是太容易。
  • 这是一个很好的回答问题的尝试,也是迄今为止我所见过的最接近成功的尝试;但请注意,您既不是程序创建几何体(您只是使用立方体组件),也不是材料(您只是加载现有材料)。这就是这里的问题;喷漆几何形状不固定;其中的每个动画都有一组不同的四边形,并且在特定动画中活动的几何图形实际上可以在您点击关键帧时在动画过程中发生变化;所以最终,不幸的是,我并没有真正接近解决方案。
  • 好吧。 =/我相信你是正确的。但只要有一点坚持和一些努力,我相信我可以做到!我承认,现在它已经成为一种痴迷。我需要解决这个问题!道格,我要么解决这个问题,要么死去。祝我好运。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-29
  • 1970-01-01
  • 2015-01-12
  • 1970-01-01
  • 2015-08-30
  • 1970-01-01
相关资源
最近更新 更多