こんにちは。ヤマヤタケシです。
久しぶりのUnityネタです。
春ですし、Unityで三角形のメッシュをワイヤーフレーム表示したくなったりするじゃないですか?
そんなわけで、ググりました。
ばっちりそういう記事を発見!
【Unity】Meshをワイヤーフレーム表示する
このコード、ほぼワンライナーでカッコイイ!
using UnityEngine;
using System.Collections;
public class Cube : MonoBehaviour {
// Use this for initialization
void Start () {
MeshFilter mf = GetComponent<MeshFilter>();
mf.mesh.SetIndices(mf.mesh.GetIndices(0),MeshTopology.LineStrip,0);
}
}
しかし、結果がイマイチでした。
ほとんどの場所は問題なかったのですが、一部、意図しないところが繋がったりしちゃいました。
原因を分析しました。
三角形のインデックスをそのままLineStripにしてるからですね。
GetIndices(0)が返す配列は、(0,1,2)(2,3,4)のように3個で1つの三角形になっています。
三角形ポリゴン情報をワイヤーにするときは、(0,1)(1,2)(2,0)にします。
そんなコードはこちらです!
//
// Wire表示にする
//
using UnityEngine;
using System.Collections;
public class WireModel : MonoBehaviour
{
Mesh mesh;
// Use this for initialization
void Start()
{
mesh = GetComponent<MeshFilter>().mesh;
var triangleList = mesh.GetIndices(0);
var triangleNum = triangleList.Length / 3;
var lineList = new int[triangleNum * 6];
for (var n = 0; n < triangleNum ; ++n)
{
var t = n * 3;
var l = n * 6;
lineList[l+0] = triangleList[t+0];
lineList[l+1] = triangleList[t+1];
lineList[l+2] = triangleList[t+1];
lineList[l+3] = triangleList[t+2];
lineList[l+4] = triangleList[t+2];
lineList[l+5] = triangleList[t+0];
}
mesh.SetIndices(lineList, MeshTopology.Lines, 0);
}
}
そんじゃまた。