如何用多个网格创建一个平面?

时间:2017-04-17 20:53:39

标签: c# unity3d unity5

我想要做的是挤出一个网格平面。 场景视图中的平面为红色。每个网格都有两个三角形。

首先我不明白Res X和Res Z是什么。 我想要首先创建的是顶点和三角形的平面,大小为16x16或任何其他尺寸的高度(长度应为高度)和宽度。 但是在我将所有属性设置为16之后,该平面是从15x15网格而不是16x16构建的。

我的主要目标是挤出飞机。我的意思是使用OnMouseDown并通过单击平面来找到我点击的顶点的壁橱和邻居并挤出这个顶点。挤出我的意思是例如只有z来改变我点击z上的位置的顶点。

在这张图片中有同样的想法。用红色圆圈标出:

Extrude

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

public class meshPlane : MonoBehaviour
{
    public int length;
    public int width;
    public int resX;
    public int resZ;

    private MeshFilter meshf;
    private Mesh mesh;
    private Vector3[] vertices;

    private void Start()
    {
        GenerateOrigin();
    }

    private void GenerateOrigin()
    {
        // You can change that line to provide another MeshFilter
        meshf = GetComponent<MeshFilter>();
        mesh = new Mesh();
        meshf.mesh = mesh;
        mesh.Clear();

        #region Vertices

        vertices = new Vector3[resX * resZ];
        for (int z = 0; z < resZ; z++)
        {
            // [ -length / 2, length / 2 ]
            float zPos = ((float)z / (resZ - 1) - .5f) * length;
            for (int x = 0; x < resX; x++)
            {
                // [ -width / 2, width / 2 ]
                float xPos = ((float)x / (resX - 1) - .5f) * width;
                vertices[x + z * resX] = new Vector3(xPos, 0f, zPos);
            }
        }
        #endregion

        #region Normales
        Vector3[] normales = new Vector3[vertices.Length];
        for (int n = 0; n < normales.Length; n++)
            normales[n] = Vector3.up;
        #endregion

        #region UVs     
        Vector2[] uvs = new Vector2[vertices.Length];
        for (int v = 0; v < resZ; v++)
        {
            for (int u = 0; u < resX; u++)
            {
                uvs[u + v * resX] = new Vector2((float)u / (resX - 1), (float)v / (resZ - 1));
            }
        }
        #endregion

        #region Triangles
        int nbFaces = (resX - 1) * (resZ - 1);
        int[] triangles = new int[nbFaces * 6];
        int t = 0;
        for (int face = 0; face < nbFaces; face++)
        {
            // Retrieve lower left corner from face ind
            int i = face % (resX - 1) + (face / (resZ - 1) * resX);

            triangles[t++] = i + resX;
            triangles[t++] = i + 1;
            triangles[t++] = i;

            triangles[t++] = i + resX;
            triangles[t++] = i + resX + 1;
            triangles[t++] = i + 1;
        }
        #endregion

        mesh.vertices = vertices;
        mesh.normals = normales;
        mesh.uv = uvs;
        mesh.triangles = triangles;

        mesh.RecalculateBounds();
    }
}

Plane

1 个答案:

答案 0 :(得分:0)

当你说“这架飞机是用15x15网格构建的”时,你的意思是这架飞机是用15x15格子建造的。整个平面就是网格。

ResX和ResZ是每个方向上有多少个点。由于第一个方块需要两条边,因此可以减少一个方形。您添加的每个方格需要另外两个,但它们可以与前一个方格共享边缘,因此您只需要一个边缘。

要使网格可点击,您需要在游戏对象中添加网格对撞机并将生成的网格分配给它。然后,您可以使用the camera class获取光线,将其放入raycast,如果您的光线投射击中任何可以使用的the triangle index和您创建的三角形数组以获得三个点被击中的三角形。此外,您可以查看the barycentric coordinates中哪个权重更大,以了解您的点击最接近哪个精确顶点。最后,既然你有精确的顶点,你可以修改它的高度。