• openDDLについて
  • サイトポリシー
  • ご利用前にお読みください
  • EN
  • SIGN IN:
  • SIGN IN:
Meshオブジェクトを描画する際に気を付けること
by Hiroaki Saito Apr 25, 2020

captureDrawMesh.PNG

Rhinoceros上でもGH上でも、3万個のBoxMeshをそのまま描画するよりも一つにJoinした方が描画スピードが速くなります。
Grasshopperの標準機能では一つのMeshオブジェクトに単色をしか適用できませんが、それでも複数色使いたい場合は頂点カラーを使います。
頂点毎に紐付いている情報なので1オブジェクトの中で複数の色情報を持つことができて、1オブジェクトのMeshなので描画も速いです。

DrawMeshWithMultiColor.mp4

ただし、オブジェクトカラーやマテリアルで色を付けている訳ではないので、RhinoにBakeした後には扱い辛いかもしれません。あくまでGrasshopper上で描画を高速化する選択肢の一つとして利用するのが良さそうです。

次に、C# Componentで同様の事をするため、CreateMonotoneMeshを使って頂点カラーを設定する方法です。
Meshを一つに結合するのにMeshオブジェクトを作ってAppendしていきますが、一つ一つAppendするよりはリスト毎Appendした方が速そうです。
頂点カラーに色を付けたMeshはPreview機能を使わなくても独自でその色を表現しますので、そのまま出力しても与えた色で描画してくれます。

  private void RunScript(List<Mesh> meshList, List<Color> colorList, ref object A)
{
Mesh mergedMesh = new Mesh();

for(int i = 0; i < meshList.Count; i++)
{
meshList[i].VertexColors.CreateMonotoneMesh(colorList[i]);
//ひとつひとつAppendするのは遅い
//mergedMesh.Append(meshList[i]);
}
//meshをリスト毎Appendした方が速い
mergedMesh.Append(meshList);
A = mergedMesh;
}

DrawViewportWiresで頂点カラーを描画する場合、DrawMeshFalseColorsを使います。それとは別にDrawMeshShadedを使うと面に色を付ける事ができます。FaceIDを指定して色を付ける事もできるので、頑張れば面毎に色を付ける事もできそうです。ただ、頂点カラーを設定したMeshでDrawMeshShadedをやると頂点カラーの色が優先して表示されるようです。しかもなぜか自己発光色ではない色で表示されます。(頂点カラーは普通は自己発光色。)

  private void RunScript(List<Mesh> meshList, List<Color> colorList, ref object A)
{
for(int i = 0; i < meshList.Count; i++)<br> {<br> meshList[i].VertexColors.CreateMonotoneMesh(colorList[i]);<br> }<br> mergedMesh.Append(meshList);<br> }</p> <p> // <Custom additional code>
Mesh mergedMesh = new Mesh();

public override void DrawViewportWires(IGH_PreviewArgs args)
{
//Vertex Colorは自己発光色なのでEdgeを別途描画。
args.Display.DrawMeshWires(mergedMesh, Color.Black);

//DrawViewportWires内で頂点カラーを描画するのに素直なのは多分DrawMeshFalseColorsを使う方法。
args.Display.DrawMeshFalseColors(mergedMesh);

//DrawMeshShadedは面に色を付けるメソッドなのに、頂点カラーが優先して表示される。しかも自己発光色でもない。
//args.Display.DrawMeshShaded(mergedMesh, new Rhino.Display.DisplayMaterial(Color.Red));
}

public override void BeforeRunScript()
{
mergedMesh = new Mesh();
}
//

</Custom additional code>
}

あまり詳しく掘り下げた訳ではないので色んなやり方があるかもしれませんが、方法の一つとして記しておきます。


コメントをするにはログインしてください。

7909 0
Tags
#Grasshopper #C# #Mesh #DrawViewportWires
License
cc_by_sa
GNU GPL

CONTACT ©2025 NIKKEN SEKKEI LTD.