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


    ホーム 一覧 単語検索 最終更新 バックアップ リンク元   ヘルプ   最終更新のRSS