如何在UE4中动态渲染四边形?

29

有一些在answers.unrealengine.com上关于这个问题的泛泛而谈的回答,但它们似乎缺乏任何细节或示例。

具体而言,如果您想要实现一组在3D游戏世界中渲染的动态纹理四边形,应该如何做到呢?请提供详细说明。

例如,考虑一个使用Spriter动画的2D侧卷游戏。可以轻松从XML加载2D动画,但如何在场景中动态地呈现这组纹理、旋转和缩放的2D四边形呢?


我认为你需要研究一下程序化静态网格和材质的创建。在UE4的API中似乎没有很好地满足这方面的需求,但你可以从https://docs.unrealengine.com/latest/INT/API/Plugins/ProceduralMeshComponent/index.html 和 https://wiki.unrealengine.com/Procedural_Materials 开始学习。 - vipw
@vipw 噢,我已经读过它们了...但我实际上无法让它们工作。如果你有一个实际运行的例子,欢迎在这个问题上获得已过期的200分奖励。 - Doug
我已经根据这段代码得到了一些工作成果:https://wiki.unrealengine.com/Procedural_Mesh_Component_in_C%2B%2B:Getting_Started另一个更复杂的例子:https://github.com/LaP0573/ue4-fbx-importer/blob/master/ProceduralEntity.cpp - vipw
1个回答

4

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

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

在蓝图中,您需要设置某些前提条件,然后根据条件选择生成角色。实际编码解决方案看起来也差不多。

如果涉及方向,则 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;
};

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

A glorious cube spawned from code!

我设置了一个类实例“DynamicMeshSpawner”,每次按下键盘上的“P”键时都会生成它。当创建此类的实例时,它调用构造函数,该构造函数使用应用的材料生成立方体。我在蓝图中使用SpawnActor节点进行了类实例生成。

Implemented in the level blueprint

你需要生成的物品所需的条件显然取决于应用程序。

这种方法适用于普通材质,但不适用于材质实例。我相信你需要更改TheMaterial的类型,ConstructorHelper调用以及从材质引用到TheMaterial的转换才能使其正常工作。

我相信这也适用于动画材质,这意味着2D动画需要转换为某种材质。

也许下面的链接会有帮助。

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

编辑2:

以下是一组非常好的示例,展示了如何在虚幻引擎中程序化地创建对象。为了保存记录和方便寻找,将其留在这里。

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


就像我在问题中所说的:“answers.unrealengine.com上有一些模糊的答案,但它们似乎缺乏任何细节或示例。”。我想要的非常简单:在运行时程序生成一个四边形,并在其上呈现一个纹理(在运行时选择)。就是这样。这不是一个模糊的问题;不幸的是,你提供的链接正是我所说的“模糊的手势”。我将很高兴接受任何实际展示如何完成此操作的代码的答案。 - Doug
公平的观点,道格。对于增加模糊性的贡献,我感到抱歉。我自己也对缺乏文档或示例而感到相当恼火,这应该是很容易实现的事情。稍等片刻,我正在努力尝试自己实现这个,很快会回复您。 - Sai Narayan
我发布了对我有效的实现。我注意到你要求在运行时选择纹理。 我相当确定这样的功能不容易实现。它需要事先将所有纹理转换为材质(在运行之前),并存储在某种数据结构中。数组是最简单的。 例如,这个数组然后需要在运行时可用于索引。前提条件会触发使用不同材质(纹理)渲染的不同四边形的生成。不是不可能,但也不太容易。 - Sai Narayan
这是一个很好的尝试来回答这个问题,到目前为止我见过最接近成功的尝试;但请注意,您既没有程序化地创建几何体(您只是使用了一个立方体组件),也没有创建材质(您只是加载了现有的材质)。这就是问题所在;Spriter 几何体并不是固定的;它中的每个动画都有一组不同的四边形,并且在特定动画中活动的几何体实际上可以随着您击中关键帧而随着动画的进行而改变;因此,不幸的是,我实际上并没有更接近解决方案。 - Doug
2
好吧,糟糕了。=/ 我相信你说得很对。 但是只要有一点毅力和努力,我相信我可以做到! 现在它已经成为了我的一个困扰。我需要解决这个问题! Doug,我要么解决这个问题,要么死而无憾。祝我好运。 - Sai Narayan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接