Заполнение индекс буфера при процедурном создании меша

Форум для самых маленьких, а так же тех, кому недосуг читать справку самостоятельно.

Заполнение индекс буфера при процедурном создании меша

Сообщение Fredo 23 сен 2011, 18:11

Столкнулся с проблемой - не могу придумать алгоритм заполнения индекс буфера при создании меша. Пишу класс что бы реализовать процедурное создание бокса (аналогично максовскому боксу, входные данные - размеры по каждой из осей, количество сегментов по каждой из осей).

Код класса
Синтаксис:
Используется csharp
using System.Collections;
using UnityEngine;

public class Box
{
        private Mesh _boxMesh;
        private Vector3[] _vertexes;
        private Vector2[] _uvCoords;
        private int[] _tris;
       
        private Vector3 _segsCount;
        private Vector3 _size;
       
        private int _polyCount;
        private int _triCount;
        private int _edgeCount;
        private int _vertexCount;
       
        public Mesh BoxMesh
        {
                get {return _boxMesh;} 
        }
       
        public Vector3[] Vertexes
        {
                get {return _vertexes;}
        }
       
        public int PolygonsCount
        {
                get {return _polyCount;}       
        }
       
        public int TrianglesCount
        {
                get {return _triCount;}
        }
       
        public int EdgesCount
        {
                get {return _edgeCount;}
        }
       
        public int VertexesCount
        {
                get {return _vertexCount;}
        }
       
        public Box()
        {
                _segsCount = new Vector3(1, 1, 1);
                _size = new Vector3(2, 2, 2);
                _vertexes = new Vector3[VertexCount()];
                _tris = new int[_triCount * 3];
                Debug.Log("_vertexes lenght : " + _vertexes.Length.ToString());
                CreateVertexes();
        }
       
        public Box(Vector3 faceCount, Vector3 size)
        {
                _segsCount = faceCount;
                _size = size;
                _vertexes = new Vector3[VertexCount()];
                _tris = new int[_triCount * 3];
                Debug.Log("_vertexes lenght : " + _vertexes.Length.ToString());
                CreateVertexes();
        }
       
        private void CreateVertexes()
        {
                int vertexIndex = 0;
                Vector3 startPoint = new Vector3(_size.x / 2,
                                                 _size.y / 2,
                                                 _size.z / 2);
                Vector3 valueDivision = new Vector3(_size.x / _segsCount.x,
                                                    _size.y / _segsCount.y,
                                                    _size.z / _segsCount.z);
                for(int z = 0; z <= _segsCount.z; z++)
                {
                        for(int y = 0; y <= _segsCount.y; y++)
                        {
                                for(int x = 0; x <= _segsCount.x; x++)
                                {
                                        if((x != 0 && y != 0 && z != 0) && ( x != _segsCount.x + 1 && y != _segsCount.y + 1 && z != _segsCount.z + 1))
                                        {
                                                _vertexes[vertexIndex] = new Vector3(startPoint.x - valueDivision.x * x,
                                                                                     startPoint.y - valueDivision.y * y,
                                                                                     startPoint.z - valueDivision.z * z);
                                                vertexIndex++;
                                        }
                                }
                        }
                }
        }

        private int PolyCount()
        {
                int xySide = (int) (_segsCount.x * _segsCount.y);
                int xzSide = (int) (_segsCount.x * _segsCount.z);
                int yzSide = (int) (_segsCount.y * _segsCount.z);
                int totalPoly = (xySide + xzSide + yzSide) * 2;
                _polyCount = totalPoly;
                return totalPoly;
        }
       
        private int TriCount()
        {
                int totalTri = PolyCount() * 2;
                _triCount = totalTri;
                return totalTri;
        }
       
        private int EdgeCount()
        {
                int totalEdge = TriCount();
                _edgeCount = totalEdge;
                return totalEdge;
        }
               
        private int VertexCount()
        {
                int totalVertex = (EdgeCount() - 12) / 2 + 8;
                _vertexCount = totalVertex;
                return totalVertex;
        }
}
 
Аватара пользователя
Fredo
UNITрон
 
Сообщения: 213
Зарегистрирован: 06 янв 2011, 05:37

Re: Заполнение индекс буфера при процедурном создании меша

Сообщение gnoblin 24 сен 2011, 00:04

В чем проблема - с непониманием в каком порядке нужно обходить вершины?
skypeid: madkust
Мои крайние проекты:
Убойный Хоккей
Cube Day Z (альфа)
Аватара пользователя
gnoblin
Адепт
 
Сообщения: 4633
Зарегистрирован: 08 окт 2008, 17:23
Откуда: Минск, Беларусь
Skype: madkust
  • Сайт

Re: Заполнение индекс буфера при процедурном создании меша

Сообщение Fredo 24 сен 2011, 04:09

Я поразмыслил, кажется придумал, просто я немного неправильный подход пытался применить сначала. Сегодня днем попробую написать. Проблема была в том что я не мог придумать эффективный метод для того чтобы писать индексы, пытался примерно в таком же цикле писать как и вершины и были проблемы с треугольниками по оси z. Сейчас попробую писать каждую сторону отдельно как плейн.
Аватара пользователя
Fredo
UNITрон
 
Сообщения: 213
Зарегистрирован: 06 янв 2011, 05:37


Вернуться в Почемучка

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

Сейчас этот форум просматривают: Google [Bot], Yandex [Bot] и гости: 20