Создание меша

Программирование на Юнити.

Создание меша

Сообщение Persenter 01 ноя 2017, 17:07

Нужна помощь. Я сам не очень шарю в создание меша, вертиксах и вершинах, но мне нужна помощь. У меня есть скрипт, который создает стены для лабиринта, но стены создаются без верха(Стены видно только из самого лабиринта, но если смотреть сверху, то их не видно). Можете помочь мне связать вершины так, чтоб стены были кубами. P.S Скрипт не мой.
Синтаксис:
Используется csharp
using System.Collections;
using System.Collections.Generic;
using System.IO;

using UnityEngine;

namespace Nox7atra.Utils
{
    public static class MeshTools
    {
        public static Mesh CreatePlaneMesh(
                    float width,
                    float height,
                    int pointsCountX,
                    int pointsCountY,
                    string objectName,
                    bool isSerialize = false,
                    string path = "",
                    float maxDismension = 10)
        {
            Mesh mesh = new Mesh();
            mesh.vertices = CreateVertices(width, height, pointsCountX, pointsCountY);
            mesh.triangles = CreatePlaneTriangles(pointsCountX, pointsCountY);
            mesh.uv = CreatePlaneUVs(mesh, maxDismension);
            mesh.RecalculateNormals();
            mesh.name = objectName;
#if UNITY_EDITOR
            if (isSerialize)
            {
                if (!Directory.Exists(path))
                {
                    Directory.CreateDirectory(path);
                }
                UnityEditor.AssetDatabase.CreateAsset(mesh,
                    string.Concat(path,
                        "/",
                        objectName,
                        ".obj"));
            }
#endif
            return mesh;
        }
        public static MeshFilter CreateMeshObj(string name, Material mat)
        {
            GameObject meshObj = new GameObject();
            MeshFilter mf = meshObj.AddComponent<MeshFilter>();
            MeshRenderer mr = meshObj.AddComponent<MeshRenderer>();
            mr.material = mat;
            meshObj.name = name;
            return mf;
        }
        public static Vector2[] CreatePlaneUVs(Mesh mesh, float maxDismension)
        {
            try
            {
                Vector3[] verts = mesh.vertices;
                Vector2[] uvs = new Vector2[verts.Length];
                Vector3 minPoint = GetPointWithMinCords(verts);
                Vector3 maxPoint = GetPointWithMaxCords(verts);
                for (int i = 0; i < uvs.Length; i++)
                {
                    uvs[i] = GetPlaneUVPoint(
                        minPoint,
                        maxPoint,
                        verts[i],
                        maxDismension);
                }

                return uvs;
            }
            catch (System.Exception e)
            {
                Debug.LogError(e.Message);
                throw e;
            }
        }
        private static Vector2 GetPlaneUVPoint(
            Vector3 min,
            Vector3 max,
            Vector3 vert,
            float maxDismension)
        {
            Vector2 uv;
            if (min.x == max.x)
            {
                uv = new Vector2(
                    (vert.y - max.y) / (min.y - max.y) * (max.x - min.x) / maxDismension,
                    (vert.z - max.z) / (min.z - max.z) * (max.y - min.y) / maxDismension);
            }
            else if (min.y == max.y)
            {
                uv = new Vector2(
                    (vert.x - max.x) / (min.x - max.x) * (max.x - min.x) / maxDismension,
                    (vert.z - max.z) / (min.z - max.z) * (max.z - min.z) / maxDismension);
            }
            else
            {
                uv = new Vector2(
                    (vert.x - max.x) / (min.x - max.x) * (max.x - min.x) / maxDismension,
                    (vert.y - max.y) / (min.y - max.y) * (max.y - min.y) / maxDismension);
            }
            return uv;
        }
        private static Vector3 GetPointWithMinCords(Vector3[] points)
        {
            Vector3 minPoint = new Vector3(
                float.MaxValue,
                float.MaxValue,
                float.MaxValue);
            for (int i = 0; i < points.Length; i++)
            {
                if (points[i].x < minPoint.x)
                {
                    minPoint.x = points[i].x;
                }
                if (points[i].y < minPoint.y)
                {
                    minPoint.y = points[i].y;
                }
                if (points[i].z < minPoint.z)
                {
                    minPoint.z = points[i].z;
                }
            }
            return minPoint;
        }
        private static Vector3 GetPointWithMaxCords(Vector3[] points)
        {
            Vector3 maxPoint = new Vector3(
                float.MinValue,
                float.MinValue,
                float.MinValue);
            for (int i = 0; i < points.Length; i++)
            {
                if (points[i].x > maxPoint.x)
                {
                    maxPoint.x = points[i].x;
                }
                if (points[i].y > maxPoint.y)
                {
                    maxPoint.y = points[i].y;
                }
                if (points[i].z > maxPoint.z)
                {
                    maxPoint.z = points[i].z;
                }
            }
            return maxPoint;
        }

        private static Vector3[] CreateVertices(
            float width,
            float height,
            int pointsCountX,
            int pointsCountY)
        {
            Vector3[] vertices = new Vector3[pointsCountX * pointsCountY];
            for (int i = 0; i < pointsCountY; i++)
            {
                float yPos = -height / 2 + height * i / (pointsCountY - 1);
                for (int j = 0; j < pointsCountX; j++)
                {
                    float xPos = -width / 2 + width * j / (pointsCountX - 1);
                    int index = j + i * pointsCountX;
                    vertices[index] = new Vector3(xPos, yPos, 0f);

                }
            }
            return vertices;
        }
        private static int[] CreatePlaneTriangles(int pointsCountX, int pointsCountY)
        {
            int numFaces = (pointsCountX - 1) * (pointsCountY - 1);
            int[] triangles = new int[numFaces * 6];
            int t = 0;
            for (int face = 0; face < numFaces; face++)
            {
                int i = face % (pointsCountX - 1) + (face / (pointsCountX - 1) * pointsCountX);

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

                triangles[t++] = i + pointsCountX;
                triangles[t++] = i + pointsCountX + 1;
                triangles[t++] = i + 1;
            }
            return triangles;
        }
    }
}
 
Persenter
UNец
 
Сообщения: 23
Зарегистрирован: 20 янв 2015, 18:04

Re: Создание меша

Сообщение Киборг 02 ноя 2017, 14:46

А зачем тебе создавать стены для лабиринта скриптом?
Сделай лучше в Blender, затем экспортируй в Unity, а затем уже с помощью Instantiate создавай их в сцене.

ИМХО, результат будет лучше.
Может ты думаешь иначе.
Аватара пользователя
Киборг
UNец
 
Сообщения: 22
Зарегистрирован: 27 окт 2017, 13:14

Re: Создание меша

Сообщение seaman 02 ноя 2017, 18:13

А зачем тебе создавать стены для лабиринта скриптом?

Ну например чтобы каждый раз лабиринт был другой.
Топикастеру. Подождите, может кто и напишет, а лучше найдите программиста в свой проект.
seaman
Адепт
 
Сообщения: 8352
Зарегистрирован: 24 янв 2011, 12:32
Откуда: Самара


Вернуться в Скрипты

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 6


cron