simplestarの技術ブログ

目的を書いて、思想と試行、結果と考察、そして具体的な手段を記録します。

Unity:頂点生成による三角柱

頂点カラーシェーダーのテスト用にメッシュオブジェクトを用意します。

ちょうど1年前に六角柱を作りましたが、やはり最も頂点数の少ない三角柱から作ろうと思います。
simplestar-tech.hatenablog.com

もう既に書式は習っているので、知っていることを利用してコードに起こしてみます。

カタカタ…

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

[RequireComponent(typeof(MeshRenderer))]
[RequireComponent(typeof(MeshFilter))]
public class Prism : MonoBehaviour
{

    [SerializeField]
    private Material _mat;

    const float root3 = 1.732051f;

    // Use this for initialization
    void Start()
    {
        var mesh = new Mesh();

        Vector3[] positions = new Vector3[] {
            // top
            new Vector3 (0f, 1f, 0f),
            new Vector3 (1f, 1f, -root3),
            new Vector3 (-1f, 1f, -root3),
            // bottom
            new Vector3 (0f, 0f, 0f),
            new Vector3 (-1f, 0f, -root3),
            new Vector3 (1f, 0f, -root3),
        };
        int[] vertIndices = new int[]
        {
            0, 1, 2,
            3, 4, 5,
            0, 2, 4,
            4, 3, 0,
            2, 1, 5,
            5, 4, 2,
            1, 0, 3,
            3, 5, 1
        };
        Vector3[] vertices = new Vector3[vertIndices.Length];
        for (int i = 0; i < vertIndices.Length; i++)
        {
            vertices[i] = positions[vertIndices[i]];
        }
        mesh.vertices = vertices;

        int[] triangles = new int[mesh.vertices.Length];
        for (int i = 0; i < mesh.vertices.Length; i++)
        {
            triangles[i] = i;
        }
        mesh.triangles = triangles;

        Vector2[] uvSources = new Vector2[]
        {
            // 天
            new Vector2 (.25f, 0.5f),
            new Vector2 (0.5f, 0.0f),
            new Vector2 (0.0f, 0.0f),

            // 底
            new Vector2 (.75f, 0.0f),
            new Vector2 (0.5f, 0.5f),
            new Vector2 (1.0f, 0.5f),

            // side R
            new Vector2 (0.0f, 1.0f),
            new Vector2 (.33f, 1.0f),
            new Vector2 (.33f, 0.5f),

            new Vector2 (.33f, 0.5f),
            new Vector2 (0.0f, 0.5f),
            new Vector2 (0.0f, 1.0f),

            // side G
            new Vector2 (.33f, 1.0f),
            new Vector2 (.66f, 1.0f),
            new Vector2 (.66f, 0.5f),

            new Vector2 (.66f, 0.5f),
            new Vector2 (.33f, 0.5f),
            new Vector2 (.33f, 1.0f),
            
            // side B
            new Vector2 (.66f, 1.0f),
            new Vector2 (1.0f, 1.0f),
            new Vector2 (1.0f, 0.5f),

            new Vector2 (1.0f, 0.5f),
            new Vector2 (.66f, 0.5f),
            new Vector2 (.66f, 1.0f)
        };
        Vector2[] uvs = new Vector2[uvSources.Length];
        for (int i = 0; i < uvSources.Length; i++)
        {
            uvs[i] = uvSources[i];
        }
        mesh.uv = uvs;

        mesh.RecalculateNormals();

        var filter = GetComponent<MeshFilter>();
        filter.sharedMesh = mesh;

        var renderer = GetComponent<MeshRenderer>();
        renderer.material = _mat;

    }

    // Update is called once per frame
    void Update()
    {

    }
}

ジャン!
f:id:simplestar_tech:20180920090443j:plain

思いついていることがいくつかあるので、次の記事で試していきます。