Forums Développement Multimédia

Aller au contenu

Creation d'un plan

CODE

1 réponse à ce sujet

#1 draad

  • Members
  • PipPipPipPipPipPipPipPip
  • 654 messages

Posté 24 October 2013 - 09:44 AM

Bonjour à tous.


Pour débuter mon apprentissage de la 3D dans unity, je me suis mis pour objectif de créer un système deau, ou plus precisement, d'ocean.

Et tout débute avec la creation d'un plan bien sûr ! Après pas mal d'efforts, j'ai créé cette classe afin de construire un plan aux dimensions et subdivisions de mon choix :


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

[ExecuteInEditMode]
public class Ocean : MonoBehaviour
{

public  int   Width  = 1;
public  int   Length  = 1;
public  int               Quads  = 1;

private float     quadsSizeX;
private float     quadsSizeY;


private MeshFilter meshFilter;
private Mesh       water;
private Vector3[]  waterVertices;
private Vector2[]  waterUv;
private int[]    waterTriangles;



// Use this for initialization
void Start ()
{
  int verticeNum  = (Quads + 1) * (Quads + 1);
  int triangleNum = Quads * 6 * Quads;
 
  quadsSizeX    = Width  / Quads;
  quadsSizeY    = Length / Quads;
 
  Debug.Log (quadsSizeX);
 
  meshFilter    = GetComponent("MeshFilter") as MeshFilter;
  water    = new Mesh ();
 
 
  waterVertices   = new Vector3[verticeNum];
  waterUv    = new Vector2[verticeNum];
  waterTriangles   = new int[triangleNum];
 
 
  int currentVertexNum = 0;
  int currentTriNum    = 0;
  bool xSwitcher   = false;
  bool ySwitcher   = false;
  for (int i = 0; i < Quads + 1; i++)
  {
   xSwitcher = !xSwitcher;
 
   for (int j = 0; j < Quads + 1; j++)
   {
    ySwitcher = !ySwitcher;
    waterVertices[currentVertexNum]  = new Vector3(i * 1, 0, j * 1);
   
    if (i - 1 >= 0 && j + 1 < Quads + 1)
    {
         waterTriangles[currentTriNum]    = currentVertexNum;
         waterTriangles[currentTriNum + 1] = currentVertexNum - Quads;
         waterTriangles[currentTriNum + 2] = currentVertexNum + 1;
    }
    if (i + 1 < Quads + 1 && j + 1 < Quads + 1)
    {
         waterTriangles[currentTriNum]    = currentVertexNum;
         waterTriangles[currentTriNum + 1] = currentVertexNum + 1;
         waterTriangles[currentTriNum + 2] = currentVertexNum + Quads + 1;
    }
   
    if (xSwitcher == true)
    {  
         if (ySwitcher == true)
         {
          waterUv[i + i * Quads + j]  = new Vector2(0, 0);
         }
         else
         {
          waterUv[i + i * Quads + j]  = new Vector2(1, 0);
         }
    }
    else
    {
         if (ySwitcher == true)
         {
          waterUv[i + i * Quads + j]  = new Vector2(1, 1);
         }
         else
         {
          waterUv[i + i * Quads + j]  = new Vector2(0, 1);
         }
    }
    currentTriNum += 3;
    currentVertexNum++;
   }
  }
 
 
  water.vertices  = waterVertices;
  water.uv   = waterUv;
  water.triangles  = waterTriangles;
 
  water.RecalculateBounds();
  water.RecalculateNormals();
 
  meshFilter.mesh  = water;
}
}
 


Mais comme vous pouvez le voir sur ce screenshot, le resulat n'est pas tout a fait là.

Image attachée: screen_plan.jpg


En fait, je soupconne qu'il faille definir les triangles dans un ordre de vertex bien precis pour que ceux-ci s'affichent correctement, j'ai cherché un peu sur le net mais je n'ai rien trouvé a ce sujet, auriez-vous un conseil pour moi?

Merci.

#2 draad

  • Members
  • PipPipPipPipPipPipPipPip
  • 654 messages

Posté 25 October 2013 - 03:02 AM

Alors, en fait, il fallait definir les triangles en appellant les vertex dans le sens des aiguilles d'une montre, sinon le triangle n'est pas rendu !



1 utilisateur(s) li(sen)t ce sujet

0 membre(s), 1 invité(s), 0 utilisateur(s) anonyme(s)