Where to even start with FDynamicMesh3?

UProceduralMeshComponent has a CreateMeshSection function, but does anyone happen to know what the equivalent would be for a USimpleDynamicMeshComponent or UOctreeDynamicMeshComponent (Not even sure which one to use). Am I supposed to get the FDynamicMesh3 and then use AppendVertices, AppendTriangles individually? Is that correct?

All I want to be able to do is create a simple Triangle :smiley:, trying to understand how it works by looking at ModelingTools implementation is insanity. There’s FDynamicMesh, FMeshDescription, Operators, Mechanics, Mesh Editors, Mesh Spatials, Compute Meshes?? etc…

If you are looking to create a Component, ie some visible geometry attached to an Actor, then you would use USimpleDynamicMeshComponent (note: in 5.0 USimpleDynamicMeshComponent is renamed UDynamicMeshComponent). And yes you would get the FDynamicMesh3, then call AppendVertex and AppendTriangle, and then call UDynamicMeshComponent::NotifyMeshUpdated().

Alternately you could construct your own FDynamicMesh3 separately and then call UDynamicMeshComponent::SetMesh().

If you have not seen them, it might be helpful to read this article on my website. It’s a bit out-of-date now though:

Basically, FDynamicMesh3 is the data - the actual vertices and triangles - and has nothing to do with Actors/Components/etc. You can use FDynamicMesh3 in pure C++ code to do mesh processing things that are not connected to gameplay. UDynamicMeshComponent is a visible Component where the 3D geometry is defined by a FDynamicMesh3 stored in the Component.

This is similar to UStaticMeshComponent/UStaticMesh, except UStaticMesh doesn’t actually contain the 3D geometry either - UStaticMesh stores the 3D geometry in a FMeshDescription. So FMeshDescription is similar to FDynamicMesh3 in that it is the actual mesh data structure, vs a container for it.

Another way to think about it is UStaticMesh is an Asset that allows multiple UStaticMeshComponent to re-use the same FMeshDescription mesh. There is no asset for FDynamicMesh3 - each UDynamicMeshComponent has it’s own FDynamicMesh3 (similar to how UProceduralMeshComponent has it’s mesh sections).

Operators, Mechanics, Mesh Editors, Compute Meshes - these are all things that are specific to our modeling tools framework and infrastructure. You would not use them to (eg) display a triangle, you would use them if you want to do mesh editing operations (either computationally or interactively).

ā€œMesh Spatialā€ generally means an AABBTree for a FDynamicMesh3, or other Mesh. Spatial == Spatial Data Structure. We use this more generic word because we can technically plug in other BVH hierarchies, octrees, etc.

UOctreeDynamicMeshComponent is a variant of USimpleDynamicMeshComponent, so it works the same way (internal FDynamicMesh3 defines what will be rendered). It supports partial updates based on a 3D Octree, but using it is quite complex and I would not recommend it unless you are trying to implement 3D mesh sculpting with dynamic/adaptive remeshing (which is what we use it for).

3 Likes

I would love if someone could create an example c++ script where I →

  1. Assign a mesh to an actor
  2. select some verts in its vertices index
  3. move those verts around in anyway

If anyone can help I would muchly appreciated it.

1 Like

When you say ā€œAssign a mesh to an actorā€, what kind of Mesh and what kind of Actor are you referring to (sorry, I know it’s complicated)

Sure, i meant assign a dynamic mesh to a static mesh actor i guess. Basically i need to create a dynamic mesh actor with code.

The link @rmsEG msEG pointed to seems pretty good for this.
What part didn’t work?