- 追加された行はこの色です。
- 削除された行はこの色です。
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.h);