2015年1月3日土曜日

【Unity】MeshTopology.Quads, 四角ポリゴンについて

四角ポリゴンがほしい(切実)

UnityはOpenGLが使えるはずなのになんで四角ポリゴンが使えないの?
読み込まれた四角ポリゴンは勝手に三角ポリゴンにされてしまいます。

↓三角ポリゴンにされたパンダくん。こいつはBlender上では四角ポリゴンで作られていたのだ。


今回は MeshTopology なるものをなんとかすれば四角ポリゴンが使えないかな?と思って試行錯誤し、その過程で得られたものをまとめることにします。


超参考: 自習室 UnityでありもののMeshをワイヤーフレームで描画する


すばらしいですね。
MeshTopology.Lines を使うことでプリミティブな Sphere をここまでかっこよくすることができるとは…
このプログラムについては自習室さんの方で丁寧に解説されているのでそちらを参考にしてください。

今回はあくまでMeshTopology.Quadsが使えるか使えないかということのみに焦点を絞ります。
参考にしてつくったプログラムがこちら

using UnityEngine;
using System.Collections;

public class MakeQuads : MonoBehaviour {

    Mesh _mesh;
    private MeshFilter _meshFilter;
    private Vector3[] _newVertices;

    void Awake()
    {
        //Reference
        _meshFilter = GetComponent<MeshFilter>();
    }

    void Start () 
    {
        _mesh = new Mesh();
        _newVertices = new Vector3[4];
        Vector2[] _newUV = new Vector2[4];

        //Set vertices
        _newVertices[0]=new Vector3(0,0,0);
        _newVertices[1]=new Vector3(1,0,0);
        _newVertices[2]=new Vector3(0,0,1);
        _newVertices[3]=new Vector3(1,0,1);

        //Set UV
        _newUV[0]= new Vector2(0,0);
        _newUV[1]= new Vector2(1,0);
        _newUV[2]= new Vector2(0,1);
        _newUV[3]= new Vector2(1,1);

        _mesh.vertices = _newVertices;
        _mesh.uv = _newUV;

        //Meshの設定、名前付け
        GetComponent<MeshFilter>().mesh = _mesh;
        GetComponent<MeshFilter>().mesh.name = "LineQuadMesh";

        _meshFilter.mesh.SetIndices(MakeIndices(), MeshTopology.Quads, 0);

        //再計算、必要?SetIndicesの前でも後でも表示は変わらなかった。
        _mesh.RecalculateNormals();
        _mesh.RecalculateBounds();

        //MeshTopologyの確認
        MeshTopology topo = _meshFilter.mesh.GetTopology(0);
        Debug.Log(topo); // Quads と出力されるはず
    }

    int[] MakeIndices()
    {
        int[] indices = new int[4];

        indices[0]=0;
        indices[1]=2;
        indices[2]=3;
        indices[3]=1;

        return indices;
    }
}

こいつを空のオブジェクトにアタッチ。
それから Mesh Filter と Mesh Renderer のコンポーネントを持たせて再生してみてください。

ピンクの四角いオブジェクトが出ると思います。
ちゃんと四角い形です。コンソールにはQuadsの文字が出ているはずです。
MeshTopology.Quadsを使う ということは一応成功しているわけですね。

しかしワイヤーフレームを表示するとわかりますが三角ポリゴンで構成されています。

ピンクなのはマテリアルを持たせていないからなので適当にマテリアルを作って貼り付ければ問題ありません。ついでに画像を用意してテクスチャとして貼ってみましょう。


エディタで作れるQuadと大差ないですね。
ということで MeshTopology.Quads では四角ポリゴンは作れないという結果で終わってしまいました。
MeshTopology.Quads はテッセレーションシェーディングで使う以外使い道はなさそうです。

以下メモのようなもの

MakeIndices() におけるインデックス番号の設定の仕方によってワイヤーフレームの表示、表示される面の向きが変わります。
時計周り、時計の反対周り、Z字など試した結果、時計周りに配置すれば上から見えることがわかりました。



このまま終わるのは悔しいので擬似的に作ってみました。

左側がエディタで作った Quad 、右側が擬似です。
各頂点の頂点座標を指定し、トポロジーを Lines にしてつなげたものになります。頂点数は4、インデックスは8になります。
四角ポリゴンっぽく見えます。が、面はありませんので面にテクスチャを貼ることはできません。

一応トポロジーが Lines でもテクスチャ貼ることはできるんですがこうなります。

右は普通の Sphere ですのでそのトポロジーは Triangles になります。

0 件のコメント:

コメントを投稿