Top > C++-ダイナミックメッシュ
[[C++]] - ダイナミックメッシュ 動的にメッシュを生成する UE4:ver.4.7.2 ---- #contents * 参考 [#tf024c0c] - Qiita - UE4でダイナミックメッシュ http://qiita.com/nkdtr/items/c2d055e349a2d03b5175 * テスト [#b9a2e101] ** 動的にポリゴン分割 [#a820620b] - Wireフレーム描画。 &ref(ue4-dynamic_mesh.gif,,); + ベースはnkdさんのダイナミックメッシュ。ポリゴンを表示できるところまで。 http://qiita.com/nkdtr/items/c2d055e349a2d03b5175 + 「UMyPrimitiveComponent」でProxyクラスを保持するようにしておく FPrimitiveSceneProxy* UMyPrimitiveComponent::CreateSceneProxy() { m_proxy = new FMySceneProxy(this); return m_proxy; } + 「UMyPrimitiveComponent」クラスにBPから分割数を設定するメソッド追加 UFUNCTION(BlueprintCallable, Category=Dynamic) void SetDivideNum(int32 num); -- BlueprintCallable: BPからアクセスできる -- Category: BP上で候補を出す時のグルーピング名 + メソッドを実装 void UMyPrimitiveComponent::SetDivideNum(int32 num) { // proxyクラスに分割数の変数を用意しておく m_proxy->m_divide = num; // Dirtyフラグを立ててポリゴン作りなおす MarkRenderDynamicDataDirty(); } + 「FMySceneProxy」のCreateMeshでいい感じに void FMySceneProxy::CreateMesh(FDynamicMeshBuilder &mesh_builder) const { if (m_divide <= 2) return; mesh_builder.AddVertex(FVector(0, 0, 0), FVector2D(0, 0), FVector(1, 0, 0), FVector(1, 1, 0), FVector(0, 0, 1), FColor::White); for (size_t i = 0 ; i < m_divide ; ++i) { float rad = FMath::DegreesToRadians(360.0f / m_divide * i); float s = sinf(rad); float c = cosf(rad); mesh_builder.AddVertex(FVector(s * 100, c * 100, 0), FVector2D(s, c), FVector(1, 0, 0), FVector(1, 1, 0), FVector(0, 0, 1), FColor::White); } for (size_t i = 1 ; i < m_divide ; ++i) { mesh_builder.AddTriangle(0, i, i+1); } mesh_builder.AddTriangle(0, m_divide, 1); } + Visual Studioでビルドしてエディターを立ち上げ直す。 + BPで適当に組む &ref(ue4-cpp-dynamic_mesh01.png,,); *** ソースコード [#m6498436] &ref(MyPrimitiveComponent.cpp); &ref(MyPrimitiveComponent.h); &ref(MySceneProxy.cpp); &ref(MySceneProxy.cpp); &ref(MySceneProxy.h); |