Forums Développement Multimédia

Aller au contenu

- - - - -

[résolu] Comment ajouter des lights sur un model collada?

CODE Actionscript

18 réponses à ce sujet

#1 Dermiste

    Ceinture Marron

  • Members
  • PipPipPipPipPipPip
  • 176 messages

Posté 08 November 2011 - 13:09 PM

Hello!

J'ai essaye en suivant le tuto sur l'eclairage des cube, d'eclairer un model collada, mais ca donne pas grand chose.
Pour être honnête je suis pas sur de la marche a suivre, j'ai essaye quelque chose comme ca:
                       
_viewport.defaultEffect = new LightingEffect();
                                               
_scene.style.set(LightingStyle.LIGHTS_ENABLED, true);                  
                       
stage.addChild(_viewport);
                       
var model : LoaderGroup = new LoaderGroup();
var options : ParserOptions = new ParserOptions();             
model.load(new URLRequest("assets/dae/stadium.dae"), options);
                       
                       
var transformed : TransformGroup = new TransformGroup(model);
var _iMesh:IMesh = new NormalMeshModifier(transformed.getDescendantsByType(IMesh) as IMesh);
var _otherGroup: TransformGroup = new TransformGroup(_iMesh);
 

Je sais juste que je dois récupérer le mesh qui vient d’être charge, et lui appliquer un NormalMeshModifier, pour ensuite le mettre dans un groupe, qui sera affiche sur la scène ... vrai ?

D'avance merci :)

#2 Dermiste

    Ceinture Marron

  • Members
  • PipPipPipPipPipPip
  • 176 messages

Posté 09 November 2011 - 11:02 AM

Please ? :(

#3 Jean-Marc Le Roux

    Ceinture Noire

  • Minko
  • PipPipPipPipPipPipPip
  • 210 messages

Posté 09 November 2011 - 15:56 PM

Voir le messagethomas.pujolle@etu.u-bordeaux3.fr, le 08 November 2011 - 13:09 PM, dit :

                       
_viewport.defaultEffect = new LightingEffect();
                                               
_scene.style.set(LightingStyle.LIGHTS_ENABLED, true);                  
                       
stage.addChild(_viewport);
                       
var model : LoaderGroup = new LoaderGroup();
var options : ParserOptions = new ParserOptions();             
model.load(new URLRequest("assets/dae/stadium.dae"), options);
                       
                       
var transformed : TransformGroup = new TransformGroup(model);
var _iMesh:IMesh = new NormalMeshModifier(transformed.getDescendantsByType(IMesh) as IMesh);
var _otherGroup: TransformGroup = new TransformGroup(_iMesh);
 

Pour l'éclairage, il faut plusieurs choses:
- des meshes qui fournissent des normales

Il y'a deux cas de figure. Soit le mesh chargé/créé contient déjà des normales. Dans ce cas, pas de soucis.
Sinon, il faut les générer. Pour cela, on va décorer les meshes impliqués avec un NormalMeshModifier, qui aura pour rôle de:
- calculer les normales par vertex
- les ajouter dans un nouveau vertex stream
- agréger ce stream à ceux du mesh décoré par le modifier

Pour décorer les meshes chargés depuis un fichier (Collada par exemple), il y'a deux solutions:
- soit on charge tout, on trouve tous les noeud Mesh (avec getDescendantsByType par exemple) et on les reparente en les décorant avec un NormalMeshModifier
- soit on fait en sorte que dés le chargement du fichier, les noeud Mesh soit parenté correctement

La première solution est relativement lourde. C'est pour cela que nous avons ajouté un moyen pour faire la seconde: il suffit d'utiliser les ParserOptions, et notamment ParserOptions.replaceNodeFunction. Cette fonction prend en argument chaque noeud de la scène chargée dans le fichier, et permet de lui substituer n'importe quel autre noeud:


var options : ParserOptions = new ParserOptions();

options.replaceNodeFunction = function(node : IScene) : IScene
{
  // if the node is a mesh and its vertex stream format doesn't contain normals
  if (node is Mesh && !(mesh.vertexStream.format.hasComponent(VertexComponent.NORMAL)))
    return new NormalMeshModifier(mesh);

  return mesh;
};

 

- activer l'éclairage dans le style des objets qu'on veut éclairer (ou dans le style de leurs ancêtres évidemment)


styleGroup.style.set(LightingStyle.LIGHTS_ENABLED, true);
 

- ajouter des lumières (n'importe où) dans la scène (sinon... forcément...), par exemple:


scene.addChild(new AmbientLight(0xffffff, .5));
 

- utiliser le LightingEffect : c'est lui qui va gérer le(s) passe(s) et les shaders qui permettent de rendre à l'écran en utilisant les équations d'éclairage


// utiliser le LightingEffect par défaut
viewport.defaultEffect = new LightingEffect();
 

ou sinon, utiliser l'effet sur un EffectGroup ou un MaterialGroup donné :


effectGroup.effect = new LightingEffect();
 

Toutes ces étapes, hormis la première, sont détaillée dans le tutorial "Display lit spinning cubes" disponible sur le hub.

a+

#4 Dermiste

    Ceinture Marron

  • Members
  • PipPipPipPipPipPip
  • 176 messages

Posté 09 November 2011 - 16:02 PM

Merci beaucoup ! Il me manquait la première, je vais essayer ca dessuite :)

#5 Jean-Marc Le Roux

    Ceinture Noire

  • Minko
  • PipPipPipPipPipPipPip
  • 210 messages

Posté 09 November 2011 - 16:17 PM

Voir le messagethomas.pujolle@etu.u-bordeaux3.fr, le 09 November 2011 - 16:02 PM, dit :

Merci beaucoup ! Il me manquait la première, je vais essayer ca dessuite :)

Normalement, si ton mesh n'a pas de normales, tu obtiens l'erreur suivante:


Missing vertex components: nx, ny, nz.
 

Je pense qu'elle est assez explicite ^^
Si tu n'as pas cette erreur, alors c'est que tu as oublié quelque chose d'autre.

a+

#6 Dermiste

    Ceinture Marron

  • Members
  • PipPipPipPipPipPip
  • 176 messages

Posté 09 November 2011 - 16:21 PM

Je viens juste d'essayer, en utilisant ca:
                        options.replaceNodeFunction = function(node : IScene) : IScene
                        {
                          // if the node is a mesh and its vertex stream format doesn't contain normals
                                if (node is Mesh && !(Mesh(node).vertexStream.format.hasComponent(VertexComponent.NORMAL))){
                                        return new NormalMeshModifier(Mesh(node));
                                } else {
                                        return node;
                                }
                        };

Et j'ai eu:
Exception fault: TypeError: Error #1034: Type Coercion failed: cannot convert aerys.minko.scene.node.mesh.modifier::NormalMeshModifier@266fae51 to aerys.minko.scene.node.mesh.Mesh.
        at aerys.minko.type.parser.collada.resource.geometry::Geometry/createMesh()[C:\workSVN\MinkoDev\minko-collada\aerys\minko\type\parser\collada\resource\geometry\Geometry.as:435]
        at aerys.minko.type.parser.collada.resource.geometry::Geometry/toSubMeshes()[C:\workSVN\MinkoDev\minko-collada\aerys\minko\type\parser\collada\resource\geometry\Geometry.as:150]
        at aerys.minko.type.parser.collada.instance::InstanceGeometry/toScene()[C:\workSVN\MinkoDev\minko-collada\aerys\minko\type\parser\collada\instance\InstanceGeometry.as:87]
        at aerys.minko.type.parser.collada.resource::Node/toTransformGroup()[C:\workSVN\MinkoDev\minko-collada\aerys\minko\type\parser\collada\resource\Node.as:129]
        at aerys.minko.type.parser.collada.instance::InstanceNode/toTransformGroup()[C:\workSVN\MinkoDev\minko-collada\aerys\minko\type\parser\collada\instance\InstanceNode.as:63]
        at aerys.minko.type.parser.collada.instance::InstanceNode/toScene()[C:\workSVN\MinkoDev\minko-collada\aerys\minko\type\parser\collada\instance\InstanceNode.as:53]
        at aerys.minko.type.parser.collada.resource::VisualScene/toGroup()[C:\workSVN\MinkoDev\minko-collada\aerys\minko\type\parser\collada\resource\VisualScene.as:64]
        at aerys.minko.type.parser.collada::ColladaDocument/toGroup()[C:\workSVN\MinkoDev\minko-collada\aerys\minko\type\parser\collada\ColladaDocument.as:137]
        at aerys.minko.type.parser.collada::ColladaParser/parse()[C:\workSVN\MinkoDev\minko-collada\aerys\minko\type\parser\collada\ColladaParser.as:63]
        at aerys.minko.scene.node.group::LoaderGroup/urlLoaderCompleteHandler()[/Users/soow/Projects/Aerys/minko/src/aerys/minko/scene/node/group/LoaderGroup.as:265]

J'suis dsl je vois pas trop comment regler la chose moi meme, j'suis tout nouveau chez minko :)

#7 Jean-Marc Le Roux

    Ceinture Noire

  • Minko
  • PipPipPipPipPipPipPip
  • 210 messages

Posté 09 November 2011 - 16:32 PM

Le dépôt minko-collada n'était pas à jour.
C'est maintenant fait.
Il suffit que tu pull minko-collada.

On a encore un peu de mal à mettre tout à jour partout donc ne t'inquiète pas ^^

a+

#8 Dermiste

    Ceinture Marron

  • Members
  • PipPipPipPipPipPip
  • 176 messages

Posté 09 November 2011 - 16:58 PM

Yes! Ca marche niquel, merci Jean-Marc!

Next step ... si je veux faire du shadow casting? J'ai en gros un model, et une plane sur lequel ce dernier est pose, ainsi qu'une spot light. Sous cinema4D la configuration des éléments amène la création d'une ombre.

J'ai trouve ca:
                        _scene.style.set(LightingStyle.CAST_SHADOWS, true);    
                        _scene.style.set(LightingStyle.SHADOWS_ENABLED, true);                 
                        _scene.style.set(LightingStyle.RECEIVE_SHADOWS, true)


Mais je pense etre un peu naif de penser que ca puisse marcher comme ca, parce que c'est pas le cas ... :(
Est-ce que je dois ajouter des informations sur mes models?

#9 Jean-Marc Le Roux

    Ceinture Noire

  • Minko
  • PipPipPipPipPipPipPip
  • 210 messages

Posté 09 November 2011 - 17:19 PM

Voir le messagethomas.pujolle@etu.u-bordeaux3.fr, le 09 November 2011 - 16:58 PM, dit :

Yes! Ca marche niquel, merci Jean-Marc!

Next step ... si je veux faire du shadow casting? J'ai en gros un model, et une plane sur lequel ce dernier est pose, ainsi qu'une spot light. Sous cinema4D la configuration des éléments amène la création d'une ombre.

J'ai trouve ca:
                        _scene.style.set(LightingStyle.CAST_SHADOWS, true);    
                        _scene.style.set(LightingStyle.SHADOWS_ENABLED, true);                 
                        _scene.style.set(LightingStyle.RECEIVE_SHADOWS, true)


Mais je pense etre un peu naif de penser que ca puisse marcher comme ca, parce que c'est pas le cas ... :(
Est-ce que je dois ajouter des informations sur mes models?

Le shadow casting c'est un très bon exemple pour comprendre pourquoi les styles - et à fortiori le fait qu'ils sont en cascade - sont super utiles. L'idée ça va être d'activer les ombres partout dans la scène, mais de dire sur chaque groupe s'il projette et/ou reçoit des ombres.

1) On active les ombres

_scene.style.set(LightingStyle.ENABLE_SHADOWS, true);
 

2) On active la projection des ombres sur un StyleGroup donné

_sceneThatCastsShadows.style.set(LightingStyle.CAST_SHADOWS, true);
 

3) On active la réception des ombres sur un StyleGroup donné

_sceneThatReceivesShadows.style.set(LightingStyle.CAST_SHADOWS, true);
 

Bien sûr, on peut activer à la fois la projection et la réception des ombres. Cela dit, le self shadowing donne parfois des résultats peu élégants.

4) On ajoute une lumière capable de projeter des ombres. Pour l'instant seules les SpotLight peuvent pour des limitations techniques inhérentes à la technique utilisée (le shadow mapping). Nous allons ajouté les ombres sur les PointLight dans la v2.


// provide a proper size for the depth map used for shadow mapping
var light : ILight = new SpotLight(0xffffff, 1., .6, 64, new Vector4(100., 100., 100.), 1000., new Vector4(1, -100, 1), 2, 1, 2048);

_scene.addChild(light);
 

Si vous voulez implémenter vos propres effets et jouer avec les styles, l'extension d'éclairage et comment nous utilisons les styles pour paramétrer le rendu sont de bonnes inspirations. L'implémentation actuelle du LightingEffect est cependant un peu brutale : on utilise encore les ASG au lieu des ActionScriptShader, du coup c'est moins lisible... ça sera corrigé dans la v2.

a+

#10 Dermiste

    Ceinture Marron

  • Members
  • PipPipPipPipPipPip
  • 176 messages

Posté 10 November 2011 - 14:16 PM

Ca marche niquel!!

Cependant ... le rendu est pas fabuleux (pièce jointe).
Il y a un moment d’améliorer ca? ou alors ca dépend juste du nombre de triangles sur mon cube ?

#11 Dermiste

    Ceinture Marron

  • Members
  • PipPipPipPipPipPip
  • 176 messages

Posté 10 November 2011 - 15:57 PM

Voici l'image

Fichier(s) joint(s)


Modifié par thomas.pujolle@etu.u-bordeaux3.fr, 10 November 2011 - 15:57 PM.


#12 Jean-Marc Le Roux

    Ceinture Noire

  • Minko
  • PipPipPipPipPipPipPip
  • 210 messages

Posté 10 November 2011 - 17:33 PM

Voir le messagethomas.pujolle@etu.u-bordeaux3.fr, le 10 November 2011 - 15:57 PM, dit :

Voici l'imageFichier-joint minkoShadow.jpg

Tu peux augmenter la taille de la depth map quand tu crées la lumière.
Tu peux aussi rapprocher la lumière des objets ombrés.

Nous travaillons sur un patch pour:
- avoir des soft shadows
- un rendu plus précis

a+

#13 Dermiste

    Ceinture Marron

  • Members
  • PipPipPipPipPipPip
  • 176 messages

Posté 10 November 2011 - 17:50 PM

Voir le messageJean-Marc Le Roux, le 10 November 2011 - 17:33 PM, dit :

Tu peux augmenter la taille de la depth map quand tu crées la lumière.
Tu peux aussi rapprocher la lumière des objets ombrés.

Nous travaillons sur un patch pour:
- avoir des soft shadows
- un rendu plus précis

a+

Si par depth map tu parles du param shadowMapSize dans la SpotLight, 2048 est la taille max ... :(

A quand toutes ces belles mises a jour ? Avant noel ? :D

Modifié par thomas.pujolle@etu.u-bordeaux3.fr, 10 November 2011 - 17:54 PM.


#14 Jean-Marc Le Roux

    Ceinture Noire

  • Minko
  • PipPipPipPipPipPipPip
  • 210 messages

Posté 11 November 2011 - 22:23 PM

Voir le messagethomas.pujolle@etu.u-bordeaux3.fr, le 10 November 2011 - 17:50 PM, dit :

Si par depth map tu parles du param shadowMapSize dans la SpotLight, 2048 est la taille max ... :(

Ca on y peut pas grand chose...

Voir le messagethomas.pujolle@etu.u-bordeaux3.fr, le 10 November 2011 - 17:50 PM, dit :

A quand toutes ces belles mises a jour ? Avant noel ? :D

Sûrement. Mais:
- les ombres seront toujours relativement moches étant donné les limitations imposées par Flash
- il faut généralement de toute façon pas mal de travail pour bien régler l'éclairage pour obtenir quelque chose de
satisfaisant

a+

#15 Logic

  • Honoris
  • PipPipPipPipPipPipPipPip
  • 2733 messages

Posté 03 December 2011 - 21:43 PM

Je tente d'utiliser les Lights sur un modèle créé dans 3dsMax exporté en .3DS Ca ne fonctionne pas à cause des normales qui semblent manquantes ("nx, ny, nz are missing...").

Pourtant mon objet est un simple Editable Mesh auquel j'ai ajouté un modificateur Edit Normals.

Le problème est qu'à l'export je n'ai aucune option à cocher qui me permette d'être sûr que les normales sont bien exportées.

Une idée ?

#16 Logic

  • Honoris
  • PipPipPipPipPipPipPipPip
  • 2733 messages

Posté 04 December 2011 - 18:43 PM

Ca fonctionne bien en configurant les options de parsing comme montré plus haut dans la discussion, mais le mystère demeure, pourquoi je n'arrive pas à exploiter les normales issus de l'export de 3DS Max ?

Je demande au cas où elles sont bien exportées (ce dont je ne suis pas sûr). Et si les normales ne sont pas dans le fichier .3DS, pourquoi ne pas activer la génération de normale par défaut ?

#17 Logic

  • Honoris
  • PipPipPipPipPipPipPipPip
  • 2733 messages

Posté 04 December 2011 - 18:55 PM

D'autant plus que la génération automatique des normales ne donnent pas forcément des résultats satisfaisants et ne saurait se substituer aux normales issus d'une modélisation dans 3D Studio.

#18 Logic

  • Honoris
  • PipPipPipPipPipPipPipPip
  • 2733 messages

Posté 04 December 2011 - 21:30 PM

Quand je passe par un export en Collada, un autre problème survient.

Les normales du modèles sont bien exportées par 3Ds Max et récupérées dans Minko.

Par contre elles se retrouvent inversées :shock:

Mes faces apparaissent visibles du coté back et non du coté front. Alors j'me suis dit que c'était pas grave et qu'il me suffisait de jouer avec le culling:

monStyle.style.set( BasicStyle.TRIANGLE_CULLING, TriangleCulling.FRONT );
// FRONT, BACK ou DISABLED,ça change strictement rien

Mais euh non, rien à faire, quel que le soit le style de culling, je ne vois mes faces que du coté back.

Je précise que j'ai 2 modules exporteurs en collada, un fourni avec 3Ds Max 10 et un autre téléchargé (openCollada), et le résultat est le même pour les 2.

Une idée ?

#19 Jean-Marc Le Roux

    Ceinture Noire

  • Minko
  • PipPipPipPipPipPipPip
  • 210 messages

Posté 05 December 2011 - 11:00 AM

Salut,

Voir le messageLogic, le 04 December 2011 - 21:30 PM, dit :

Par contre elles se retrouvent inversées :shock:

Oui. En fait collada est en repère main droite, et Minko est par défaut en repère main gauche (comme la plupart des autres technos.). Du coup, tout se retrouve inversé. Donc la géométrie chargée sera affichée en inversant la droite et la gauche.

Il y'a deux manières de fixer ça :
- utiliser un TransformGroup pour appliquer une scale de -1 sur l'axe X (il me semble qu'on a fait ça pour un projet et ça marche)
- utiliser un StyleGroup pour mettre le triangle culling à TriangleCulling.FRONT et le BasicStyle.NORMAL_MULTIPLIER à -1 pour inverser le sens des normales

Quoiqu'il en soit, c'est quelque chose qui sera fait automatiquement par le parser Collada dans la prochaine version. Et surtout, nous encouragerons l'utilisation du format *.MK, bien meilleur que Collada ou 3DS.

a+



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