GSダイナミックメッシュアクター

GSダイナミックメッシュアクター

GeometryScript DynamicMeshActor。

ADynamicMeshActor は、主に UDynamicMeshComponent のコンテナであるという点で AStaticMeshActor に似ています。ただし、DynamicMeshActor は、UDynamicMesh に基づいた手続き型メッシュ生成を実装する必要がある Actor ブループリントに対していくつかの特定のサポートを提供します。

以前は新しい StaticMesh アセットのみを作成できたモデリング モード ツールは、新しい DynamicMesh アクタも作成できるようになり、編集ツールは编辑あらゆるタイプのメッシュ アクタで動作できるようになりました。

UE5 は、関連する DynamicMesh 解析をプログラムで生成します。

ADynamicMeshActorUSimpleDynamicMeshComponentRootObject をそのまま持つアクタです。

ここに画像の説明を挿入します

AActor
ADynamicMeshActor
UDynamicMeshComponent
UBaseDynamicMeshComponent
UMeshComponent
UPrimitiveComponent
USceneComponent
UActorComponent
UDynamicMesh
FDynamicMesh3

FDynamicMesh3 は、動的三角形メッシュ クラスです。メッシュには接続性があり、
インデックス付きメッシュであり、インデックス空間内のギャップが許容されます。

FDynamicMesh3 は、動的三角形メッシュ クラスです。グリッドは接続されており、インデックス グリッドです。基本的なジオメトリ データを保存するだけでなく、いくつかのトポロジ接続関係も保存して、素早いクエリやその他の関連するジオメトリ操作を容易にします。

Engine\Source\Runtime\GeometryFramework\Public\DynamicMeshActor.h

// Copyright Epic Games, Inc. All Rights Reserved.

#pragma once

#include "CoreMinimal.h"
#include "UDynamicMesh.h"
#include "Components/DynamicMeshComponent.h"

#include "DynamicMeshActor.generated.h"


/**
 * ADynamicMeshActor is an Actor that has a USimpleDynamicMeshComponent as it's RootObject.
 */
UCLASS(ConversionRoot, ComponentWrapperClass, ClassGroup=DynamicMesh, meta = (ChildCanTick))
class GEOMETRYFRAMEWORK_API ADynamicMeshActor : public AActor
{
    
    
	GENERATED_UCLASS_BODY()

protected:
	UPROPERTY(Category = DynamicMeshActor, VisibleAnywhere, BlueprintReadOnly, meta = (ExposeFunctionCategories = "Mesh,Rendering,Physics,Components|StaticMesh", AllowPrivateAccess = "true"))
	TObjectPtr<class UDynamicMeshComponent> DynamicMeshComponent;

public:
	UFUNCTION(BlueprintCallable, Category = DynamicMeshActor)
	UDynamicMeshComponent* GetDynamicMeshComponent() const {
    
     return DynamicMeshComponent; }



	//
	// Mesh Pool support. Meshes can be locally allocated from the Mesh Pool
	// in Blueprints, and then released back to the Pool and re-used. This
	// avoids generating temporary UDynamicMesh instances that need to be
	// garbage-collected. See UDynamicMeshPool for more details.
	//

public:
	/** Control whether the DynamicMeshPool will be created when requested via GetComputeMeshPool() */
	UPROPERTY(Category = DynamicMeshActor, EditAnywhere, BlueprintReadWrite)
	bool bEnableComputeMeshPool = true;
protected:
	/** The internal Mesh Pool, for use in DynamicMeshActor BPs. Use GetComputeMeshPool() to access this, as it will only be created on-demand if bEnableComputeMeshPool = true */
	UPROPERTY(Transient)
	TObjectPtr<UDynamicMeshPool> DynamicMeshPool;

public:
	/** Access the compute mesh pool */
	UFUNCTION(BlueprintCallable, Category = DynamicMeshActor)
	UDynamicMeshPool* GetComputeMeshPool();

	/** Request a compute mesh from the Pool, which will return a previously-allocated mesh or add and return a new one. If the Pool is disabled, a new UDynamicMesh will be allocated and returned. */
	UFUNCTION(BlueprintCallable, Category = DynamicMeshActor)
	UDynamicMesh* AllocateComputeMesh();

	/** Release a compute mesh back to the Pool */
	UFUNCTION(BlueprintCallable, Category = DynamicMeshActor)
	bool ReleaseComputeMesh(UDynamicMesh* Mesh);

	/** Release all compute meshes that the Pool has allocated */
	UFUNCTION(BlueprintCallable, Category = DynamicMeshActor)
	void ReleaseAllComputeMeshes();

	/** Release all compute meshes that the Pool has allocated, and then release them from the Pool, so that they will be garbage-collected */
	UFUNCTION(BlueprintCallable, Category = DynamicMeshActor)
	void FreeAllComputeMeshes();
};



UE5 AGeneratedDynamicMeshActor オブジェクト

GeneratedDynamicMeshActor を使用してメッシュを動的に生成する前に、まずGeometry Scriptプラグインを有効にします。

AActor
ADynamicMeshActor
GeneratedDynamicMeshActor

AGeneratedDynamicMeshActor is an Editor-only subclass of ADynamicMeshActor that provides special support for dynamic procedural generation of meshes in the Editor, eg via Blueprints. Expensive procedural generation implemented via BP can potentially cause major problems in the Editor, in particular with interactive performance. AGeneratedDynamicMeshActor provides special infrastructure for this use case. Essentially, instead of doing procedural generation in the Construction Script, a BP-implementable event OnRebuildGeneratedMesh is available,and doing the procedural mesh regeneration when that function fires will generally provide better in-Editor interactive performance.

AGeneratedDynamicMeshActor は ADynamicMeshActor のサブクラスであり、エディター モードでのみ使用されます。ADynamicMeshActor の目的は、ブループリントの使用など、エディター モードでのメッシュの動的プログラム生成のサポートを提供することです。エディター モードでブループリントを使用して動的に手続き型メッシュを大量に生成すると、インタラクティブなパフォーマンスの点で大きな問題が発生する可能性があります。AGeneratedDynamicMeshActor は、この問題に対する特殊なソリューションを提供します。基本的に、エディター編集モードでメッシュをインタラクティブに生成する場合、ブループリントによって実装されたイベントに基づいて OnRebuildGeneratedMesh でプログラム的に生成した方が、ブループリント コンストラクション スクリプトでプログラム的に生成するよりも良い結果が得られます。

プログラムでボックスを生成します。
ここに画像の説明を挿入します
右側のボックス サイズ アイコンをドラッグして、ボックスを動的に拡大縮小します。
ここに画像の説明を挿入します
ボックスを追加し、最初のボックスでブール演算の減算を実行します。
ここに画像の説明を挿入します

ここに画像の説明を挿入します

GS機能

提供される関連ブループリント機能
UGeometryScriptLibrary_MeshPrimitiveFunctions::AppendSimpleExtrudePolygon
ポリゴン押し出し
UGeometryScriptLibrary_MeshSpatial::BuildBVHForMesh
BVH 空間インデックス
FGeometryScriptDynamicMeshBVH->FindNearestPointOnMesh
BVH 空間インデックスを使用してメッシュ上の最も近い点を検索

カスタムダイナミックメッシュアクター

実行時に使用できる DynamicMeshActor オブジェクトをカスタマイズします。

TObjectPtr<UDynamicMeshPool> DynamicMeshPool = NewObject<UDynamicMeshPool>();
UDynamicMesh* OutMesh = DynamicMeshPool->RequestMesh();
OutMesh->EditMesh([&](FDynamicMesh3& EditMesh)
		{
    
    
			FVector newVertex;
			FIndex3i newTriangle;
			int32 ConstantGroupID = EditMesh.AllocateTriangleGroup();

			for (size_t i = 0; i < VertexCount; i++)
			{
    
    
				newVertex.X;
				newVertex.Y;
				newVertex.Z;
				EditMesh.AppendVertex(newVertex);
			}

			for (size_t i =0; i < TriangleCount; i++)
			{
    
    
				newTriangle.A ;
				newTriangle.B;
				newTriangle.C;

				EditMesh.AppendTriangle(newTriangle, ConstantGroupID);
			}

		}, EDynamicMeshChangeType::GeneralEdit, EDynamicMeshAttributeChangeFlags::Unknown, false);

AActor* Actor = Cast<AActor>(GetWorld()->SpawnActor(AActor::StaticClass()));
UDynamicMeshComponent* DMCom = NewObject<UDynamicMeshComponent>(Actor);
DMCom->RegisterComponent();
DMCom->SetMesh(MoveTemp(OutMesh->GetMeshRef()));
Actor->SetRootComponent(DMCom);
Actor->SetActorLabel(TEXT("F6"));

DynamicMeshPool->ReturnMesh(OutMesh);

ここに画像の説明を挿入します

参考

  1. https://docs.unrealengine.com/5.0/zh-CN/geometry-script-users-guide/
  2. https://blog.csdn.net/mrbaolong/article/details/131543522?spm=1001.2014.3001.5501

おすすめ

転載: blog.csdn.net/mrbaolong/article/details/131543522
おすすめ