Forums Développement Multimédia

Aller au contenu

- - - - -

Mesh.merge

CODE Actionscript

2 réponses à ce sujet

#1 Nataly

    Community Jane

  • Moderateur
  • PipPipPipPipPipPipPipPip
  • 5783 messages

Posté 03 November 2011 - 17:17 PM

A mon tour de harceler :mrgreen: :

A la suite de ce sujet :
http://flash.mediabo...101#entry845101


Citation

- Minko propose déjà tout ce qu'il faut pour combiner plusieurs meshs en un seul (voir la méthode Mesh.merge et les classes AtlasTexture/AtlasUVModifier). C'est très très très efficace pour toute la géométrie statique. Pour voir un exemple "fait main", tu peux regarder le code de la démo Google Globe qui merge des milliers de cubes dans un seul mesh

Si on regarde le code du Google-globe ça ne donne pas l'impression que Mesh.merge soit utilisé (suite à une recherche à 'merge' sur tout les fichiers utilisés). Les cubes sont codés les un à la suite des autres directement dans le même VertexStream.

Quand on essaie d'utiliser Mesh.merge on reçoit des messages d'erreurs.
Pour l'instant avec un code qui ressemble à ca (basé sur le dernier tuto sur Minko):


 private function initialize() : void
        {
            _viewport = new Viewport();
            stage.addChild(_viewport);
             
            _camera.distance = 50.;
             
            _viewport.defaultEffect = new LightingEffect();
             
            _scene.style.set(LightingStyle.LIGHTS_ENABLED, true);
             
            //_scene.addChild(_blueGroup)
            //      .addChild(_whiteGroup);      
             
            for (var i : Number = 0; i < CUBE_SIZE; i++)
            {
                for (var j : Number = 0; j < CUBE_SIZE; j ++)
                {
                    for (var k : Number = 0; k < CUBE_SIZE; k++)
                    {
                        var cube : TransformGroup = new TransformGroup
                            ((i + j + k) % 2 ?
                                _blueCube :
                                _whiteCube);
                         
                        cube.transform.appendTranslation(
                            i * (1 + GAP) - (1 + CUBE_SIZE) * GAP / 2.,
                            j * (1 + GAP) - (1 + CUBE_SIZE) * GAP / 2.,
                            k * (1 + GAP) - (1 + CUBE_SIZE) * GAP / 2.);
                         
                        if ((i + j + k) % 2)
                            _blueGroup.addChild(cube);
                        else
                            _whiteGroup.addChild(cube);
                    }
                }
            }
           
                        var whiteMesh:IMesh = Mesh.merge(Vector.<IMesh>(_whiteGroup.getDescendantsByType(IMesh)));
                        var blueMesh:IMesh = Mesh.merge(Vector.<IMesh>(_blueGroup.getDescendantsByType(IMesh)));
                       
                        _scene.addChild(whiteMesh);
                        _scene.addChild(blueMesh);
                       
                       
            stage.addEventListener(Event.ENTER_FRAME, enterFrameHandler);
            stage.addEventListener(MouseEvent.MOUSE_WHEEL, mouseWheelHandler);
            stage.addEventListener(MouseEvent.MOUSE_MOVE, mouseMoveHandler);
        }
 

On obtient le message d'erreur suivant

Citation

[Fault] exception, information=Error: Vertex components 'r, g, b' are missing but required by the 'lighting pass' shader.

Merci d'avance !
:)
Le savoir est le seul bien qui s'accroit quand on le partage
une tartine de tutos

#2 Jean-Marc Le Roux

    Ceinture Noire

  • Minko
  • PipPipPipPipPipPipPip
  • 210 messages

Posté 04 November 2011 - 00:16 AM

Voir le messageNataly, le 03 November 2011 - 17:17 PM, dit :

On obtient le message d'erreur suivant

Citation

[Fault] exception, information=Error: Vertex components 'r, g, b' are missing but required by the 'lighting pass' shader.

Cette erreur signifie que le shader, ici nommé "lighting pass" il s'agit du shader qui gère la passe d'éclairage dans le LightingEffect, n'a trouvé aucune texture utilisable et fallback sur la couleur des vertex. Hors à priori les vertices de tes meshes ont un format qui n'inclut pas de couleur RGB.

Je pense que ça n'a rien à voir avec la fonction Mesh.merge, tu as du plutôt oublier d'ajouter des textures avant tes meshes dans la scène.

Citation

Si on regarde le code du Google-globe ça ne donne pas l'impression que Mesh.merge soit utilisé

Non, mais ça montre comment faire le merge soit même et en prenant en compte une transformation 3D pour chaque objet mergé, ce qui n'est pas le cas avec Mesh.merge() qui se content de "concaténer" la géométrie.

Donc les deux sont complémentaires.

D'ailleurs, la fonction en question de la démo Google Globe montre deux versions:

Citation

for (var i : int = 0; i < 8; ++i)
{
// fast but unclear
data.push(TMP_VERTICES[int(i * 3)],
TMP_VERTICES[int(i * 3 + 1)],
TMP_VERTICES[int(i * 3 + 2)],
((color >> 16) & 0xff) / 255.,
((color >> 8) & 0xff) / 255.,
(color & 0xff) / 255.);

// slow but convenient
/*var vertex : VertexReference = new VertexReference(stream);

vertex.x = TMP_VERTICES[int(i * 3)];
vertex.y = TMP_VERTICES[int(i * 3 + 1)];
vertex.z = TMP_VERTICES[int(i * 3 + 2)];
vertex.r = ((color >> 16) & 0xff) / 255.;
vertex.g = ((color >> 8) & 0xff) / 255.;
vertex.b = (color & 0xff) / 255.;*/
}

a+

#3 Nataly

    Community Jane

  • Moderateur
  • PipPipPipPipPipPipPipPip
  • 5783 messages

Posté 04 November 2011 - 11:04 AM

yop !

:) merci :)
Le savoir est le seul bien qui s'accroit quand on le partage
une tartine de tutos



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

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

authorised training centre

Centre de Formation Mediabox - Adobe et Apple Authorised Training Center.

Déclaré auprès de la Direction du Travail et de la Formation Professionnelle

Mediabox : SARL au capital de 62.000€ - Numéro d'activité : 11 75 44555 75 - SIRET : 49371646800035

MEDIABOX, 23, rue de Bruxelles, 75009 PARIS

FFP