2017-10-29 13 views
0

私は手続き的に3次元グリッド/タイルベースの地形を16x16タイルの塊で生成しています。今私は、これらのチャンクに道路や木のような他のカスタムメッシュのメッシュメッシュを追加したいと思っています。地形は、各メーターに2つの三角形を配置し、高さマップに基づいてこのタイル/クワッドの角を上げることで簡単に作成します。メッシュを結合するときの位置とマテリアルのコントロール

私はモデルの個々のメッシュを配列として作成し、それらをコピーして地形と組み合わせてドローコールを保存したいとします。私は現在MeshCombineでこれを試していますが、私は2つの問題に遭遇します。

  1. カスタムメッシュの配置ができません。メッシュには変換がありませんので、変換行列を結合で使用することはできません。完全なGameObjectを作成することは大急ぎです。カスタムメッシュの各頂点をオフセットすることができましたが、原点を設定するか、メッシュ全体を変換するなどの簡単な方法が必要であると感じています。

  2. メッシュが正しく表示されません。明らかに彼らは私が地形のために使った材料を得るからです。したがって、マットID 1は地形によって割り当てられたマテリアルを取得し、マットID 2はレンダリングされません。これをプログラムで変更することはできませんので、3Dアプリケーションでこれらを正しく設定する必要がありますか?

    • 地形ID1
    • 道路ID2 + ID3
    • ツリーID4 + ID5
    • ビルID6 + ID7 + ID8 +など:とても好きです。

あなたはおそらく、これはかなり面倒です想像することができます。だから私は位置を含むFBXモデルからメッシュを追加する方法を探しています。それは手続き的に生成されたメッシュへのマテリアルです。

答えて

0

私は方法を見つけるようになった、私は更新し、私が行くようにこの答えをクリーンアップします。

CombineInstanceは、結合したいメッシュ上にトランスフォームを設定するための変換マトリックスを取ることができます。残念ながらnew Transformは不可能ですが、幸運にも最初から変換行列を作成するのは簡単です。

Matrix4x4 transformMatrix = new Matrix4x4(); 
    //transformMatrix.SetTRS(position, quaternion, scale) 
    transformMatrix.SetTRS(new Vector3(0, 10, 0), Quaternion.Euler(-90, 0, 0), new Vector3(1, 1, 1)); 

材料を得るために右我々は、異なる材料で各subMeshの配列内の次のCombineInstanceインデックスに同じメッシュを追加する必要があります。

for (int i = 0; i < customMesh.subMeshCount; i++) 
    { 
     combine[currentIndex + i].mesh = Instantiate(customMesh); 
     combine[currentIndex + i].transform = transformMatrix; 
     combine[currentIndex + i].subMeshIndex = i; 
    } 

しかし、これはサブメッシュは、同じ材料を使用している場合でも、我々は材料のリストを成長させる必要がある各サブメッシュするための手段。私の場合は、すべてのメッシュがマテリアルを共有しています。この方法では、各チャンクの要素が何千もある配列になります。

道路のさまざまな部分を定義するためにテクスチャを使用するだけで、テクスチャとテクスチャが1つしかありません。すべての道路の木のため、各chunck負荷に対して同じ、そしてその他すべての木のは、これはいくつかの問題を提起ん:私は、それぞれ異なる道路ピースにそれ自身の質感を与える場合

  • は、私が最初の場所に[0]、すべての道路を必要としますすべての道路[1]などを各チャンクごとに表示します。
  • 私はそれぞれの顔にユニークなテクスチャ空間を与え、後で追加のピースを追加したい場合は、自分のUV空間を押し広げたり、そのピースに追加のマテリアルを追加する必要があります。

どちらのオプションも理想的ではありません。

私が考えることのできるもう1つの方法は、共有された素材要素を先に行うことです。道路のように、歩道にはコンクリート材料を使用し、センターにはアスファルト材料を使用します。まず最初にすべての最初の(コンクリート)サブメッシュ道路を走り、もう1つは2番目のサブメスを走ります。しかし、これは非常に醜い/ハッキーです、だけでなく、すべてのサブメッシュインデックスが同じ材料を共有することを確認する必要があります。コンクリート材料を建物に使用したい場合は、重複した材料を再度入力するか、道路(コンクリート)サブメッシュの直後にその建物(コンクリート)サブメッシュを実行する必要があります。

大型のタイル加工可能な素材やテクスチャなしの平らな陰影を付けた色でも作業し、必要に応じてこれらのテクスチャ/素材を再利用するのはとても良いことです。

以下はうまくいくかもしれませんが、いくつかのメッシュのカスタムツイッキングが必要です。

material[0] = asphalt; 
material[1] = concrete; 
material[2] = wood; 

//Roads 
int matIndex = 0; 
for (int i = 0; i < customMesh.subMeshCount; i++) 
{ 
    combine[currentIndex + i].mesh = Instantiate(customMesh); 
    combine[currentIndex + i].transform = transformMatrix; 
    //combine[currentIndex + i].subMeshIndex = i; 
    //Instead assign a material index. 
    combine[currentIndex + i].materialIndex = matIndex + i; 
} 

//building 
int matIndex = 1; 
for (int i = 0; i < customMesh.subMeshCount; i++) 
{ 
    combine[currentIndex + i].mesh = Instantiate(customMesh); 
    combine[currentIndex + i].transform = transformMatrix; 
    combine[currentIndex + i].materialIndex = matIndex + i; 
} 
関連する問題