[DB-AL]probleme de base , voxel

Pour les scripts écrits en C#
Règles du forum
Merci de respecter la NOMENCLATURE suivante pour vos TITRES de messages :

Commencez par le niveau de vos scripts
DB = Débutant
MY = Moyen
CF = Confirmé

Puis le domaine d'application
-RS = Réseau
-AL = Algorithmie

Exemple :

[DB-RS] Mouvement perso multijoueur
CROUK
Messages : 6
Inscription : 15 Jan 2018 12:23

[DB-AL]probleme de base , voxel

Message par CROUK » 18 Fév 2018 16:09

Voici un petit code que je me suis amuser a faire pour en apprendre plus sur les voxel.
il s'inspire en grande parti de plusieurs tuto trouvé sur le web, comme j'ai un peu de mal a tout comprendre et que ça n'est pas instructif de faire du copié/collé. je réécrit une version de base pour comprendre tout les rouage
je souhaite simplement faire un empilement de boite décrit par la taille d'un chunk
exemple : si chunkx y et z vaux chacun 2 , je devrait avoir 2x2x2 boites. mais ça ne marche pas, seul la dernière des 8 boite est calculé .
ou est mon erreur?

comment faire pour que ce code me rende 8 cubes empilé en 2x2x2 ( ou tout autre valeur rentré en chunksize dans l'inspector) au lieu d'un seul ?


(c'est la méthode la plus basique avec tout les vertices et face interne calculé , je sait , mais j'ai déjà besoin de ça pour comprendre la suite, la création du mesh de chacun faces sont séparé en plusieurs méthode justement pour ne plus le faire par la suite)



Appliquer un gameobject empty avec un meshfilter , un mesh renderer un mesh collider et ce script.

Code : Tout sélectionner

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

public class Voxel : MonoBehaviour
{
    public int chunkSizeX = 2;
    public int chunkSizeY = 2;
    public int chunkSizeZ = 2;



    private int voxelCountX;
    private int voxelCountY;
    private int voxelCountZ;



    private Mesh mesh;
    private new MeshRenderer renderer;
    private new MeshCollider collider;


    private Vector3[] vertices = new Vector3[8];
    private int[] triangles = new int[36];





    private void Start()
    {
        Vector3 Chunk = new Vector3(chunkSizeX, chunkSizeY, chunkSizeZ);
        

        mesh = gameObject.GetComponent<MeshFilter>().mesh;
        renderer = gameObject.GetComponent<MeshRenderer>();
        collider = gameObject.GetComponent<MeshCollider>();

        
        
            for (int z =0; z<chunkSizeZ; z++)
            {
            if (voxelCountZ == chunkSizeZ)
            { voxelCountZ = 1; }
            
            else { voxelCountZ++; }
            

                for (int y = 0; y< chunkSizeY; y++)
                {
                if (voxelCountY == chunkSizeY)
                {
                    voxelCountY = 1;
                }
                else
                    voxelCountY++;
                

                for (int x = 0; x < chunkSizeX; x++)
                    {

                    if (voxelCountX == chunkSizeX)
                    { voxelCountX = 1; }

                    else { voxelCountX++; }

                        GetVertices();
                        GetTriangles();
                        
                        MakeMesh();

                    print("x" + voxelCountX + "y" + voxelCountY + "z" + voxelCountZ);


                }
            }
        }

        




    }

    void GetVertices()
    {
        int x = voxelCountX;
        int y = voxelCountY;
        int z = voxelCountZ;



        vertices[0] = new Vector3(x -1 , y  -1 , z  -1  );
        vertices[1] = new Vector3(x    , y  -1 , z  -1  );
        vertices[2] = new Vector3(x -1 , y     , z  -1  );
        vertices[3] = new Vector3(x    , y     , z  -1  );
        vertices[4] = new Vector3(x -1 , y  -1 , z      );
        vertices[5] = new Vector3(x    , y  -1 , z      );
        vertices[6] = new Vector3(x -1 , y     , z      );
        vertices[7] = new Vector3(x    , y     , z      );

        
    }


    void GetTriangles()
    {
        
        

        GetTrianglesFront();
        GetTrianglesBack();
        GetTrianglesTop();
        GetTrianglesDown();
        GetTrianglesLeft();
        GetTrianglesRight();

    }

    void GetTrianglesFront()
    {
       
        triangles[0] = 0;
        triangles[1] = 2;
        triangles[2] = 1;
        triangles[3] = 1;
        triangles[4] = 2;
        triangles[5] = 3;

    }

    void GetTrianglesBack()
    {

        triangles[6] = 4;
        triangles[7] = 5;
        triangles[8] = 7;
        triangles[9] = 4;
        triangles[10] = 7;
        triangles[11] = 6;

    }

    void GetTrianglesTop()
    {

        triangles[12] = 2;
        triangles[13] = 6;
        triangles[14] = 3;
        triangles[15] = 3;
        triangles[16] = 6;
        triangles[17] = 7;

    }

    void GetTrianglesDown()
    {

        triangles[18] = 0;
        triangles[19] = 1;
        triangles[20] = 4;
        triangles[21] = 1;
        triangles[22] = 5;
        triangles[23] = 4;

    }

    void GetTrianglesLeft()
    {

        triangles[24] = 0;
        triangles[25] = 4;
        triangles[26] = 2;
        triangles[27] = 4;
        triangles[28] = 6;
        triangles[29] = 2;

    }

    void GetTrianglesRight()
    {

        triangles[30] = 1;
        triangles[31] = 3;
        triangles[32] = 5;
        triangles[33] = 3;
        triangles[34] = 7;
        triangles[35] = 5;

    }

    void MakeMesh()

    {

        mesh.Clear();
        mesh.vertices = vertices;
        mesh.triangles = triangles;

        renderer.material = new Material(Shader.Find("Diffuse"));
        MeshUtility.Optimize(mesh);

        collider.sharedMesh = null;

        collider.sharedMesh = mesh;

    }

}

Répondre

Revenir vers « (C#) CSharp »