前置き
直線を普通に引きたい場合はLineRendererを使えば良い.
勉強のために、自分でMeshを作り直線をポリゴンで引いてみた.
(GL_LINEで引く方法もあるけれど、今回はあくまでポリゴンで)
線分とポリゴン
1つの線分は、上記のような感じで2つのポリゴンを描けば良い.
Meshは各頂点(verticies)とポリゴン描画時の頂点順序(triangles)を指定することで生成できる.
Vector3[] verts; // ポリゴンの頂点を入れる
int[] triangles; // 三角形を描く際に、頂点の描画順を指定する
Mesh mesh = new Mesh();
mesh.vertices = verts
mesh.triangles = triangles;
mesh.RecalculateBounds();
mesh.RecalculateNormals();
Meshさえできてしまえば、MeshFilterとMeshRendererを設定することでポリゴンの描画ができる.
Material material; // 直線描画用のマテリアル
Mesh mesh; // 生成できたMesh
var _object = new GameObject("PolygonLine");
var meshFilter = _object.AddComponent<MeshFilter>();
var meshRenderer = _object.AddComponent<MeshRenderer>();
meshFilter.sharedMesh = mesh;
meshRenderer.material = material;
ポリゴンと頂点順序
ポリゴンを描画する際に頂点順序を指定する必要がある.
x-z 平面で頂点順序を指定する場合,
時計回りだと、表向きになる. (index: 0 -> 1 -> 2)
逆向きだと、裏向きになる. (index: 2 -> 1 -> 0)
線分を書く際には、この頂点の指定順序をきっちり設定する必要がある.
上記のような線分であれば、頂点indexの順序は以下のような感じ.
int[] triangles = new [] { 0,1,2, 2,1,3 };
連続する線分の描画
連続する線分を綺麗に描画するには,各頂点を線分の太さの半分だけ上下にずらした点を作るだけでなく、中点の位置をきちんと計算する必要がある.
中点の計算は説明省略, 普通に中学数学で交点を求めればいい.
実行例
実際にプログラムを組んで実行してみた.
中点が綺麗に描画できている
上記で説明した実装の詳細は以下のような感じ.