Forums Développement Multimédia

Aller au contenu

- - - - -

Texturer un cube avec 6 images

CODE Actionscript

44 réponses à ce sujet

#1 pol2095

  • Members
  • PipPipPipPipPipPipPipPip
  • 1786 messages

Posté 02 January 2012 - 16:04 PM

Bonjour,

j'arrive à réaliser un cube sans texture, j'ai 6 images qui représentent les 6 faces de mon cube, je voudrais savoir comment appliquer ces textures à mon cube ?

merci

#2 Jean-Marc Le Roux

    Ceinture Noire

  • Minko
  • PipPipPipPipPipPipPip
  • 210 messages

Posté 03 January 2012 - 09:13 AM

Voir le messagepol2095, le 02 January 2012 - 16:04 PM, dit :

j'arrive à réaliser un cube sans texture, j'ai 6 images qui représentent les 6 faces de mon cube, je voudrais savoir comment appliquer ces textures à mon cube ?

Si tu as la possibilité de mettre les 6 textures dans une plus grande alors c'est le plus simple: tu as juste à créer un cube mesh et à en modifier les UVs. Ça se fait facilement avec un itérateur:


var mesh : IMesh = new CubeMesh();
var vertices : VertexIterator = new VertexIterator(mesh.vertexStream);

for (var j : int = 0; j < 6; j++)
{
for (var i : int = 0; i < 6; i++)
{
  vertices[j * 6 + i].u /= j;
  vertices[j * 6 + i].v /= j;
}
}
 

Chacune des faces du cube ainsi modifié utilisera 1/6 de la texture.

Si tu ne peux pas réunir les 6 textures en une, il y'a deux méthodes:
1 - utiliser le multi-texturing (comme à chaque fois qu'on veut avoir plusieurs textures pour un seul mesh): couteux en GPU et pas très flexible car demande d'écrire un shader assez lourd qui va - quoiqu'il arrive - sampler les 6 textures
2 - utiliser 6 mesh différents (1 par face)

La méthode 2 est sans aucun doute la meilleure. Pour la réaliser, deux solutions:
2 a - Représenter chaque face par un TransformGroup dans lequel on met la texture puis un QuadMesh. La propriété "transform" nous permettant d'orienter/de déplacer le quad pour en faire une des faces du cube.
2 b - Définir un mesh pour chaque face du cube: ça prend plus de mémoire (mais ça reste négligeable) mais ça ne demande aucun calcul sur le CPU

La 2 b est à mon sens la meilleure, sauf si tu as prévu de déplacer les faces du cube auquel cas tu devras de toute façon utiliser des TransformGroup et tu devrais donc choisir la 2 a.

La 2 b s'implémente assez facilement car il est assez facile de créer des mesh de manière procédurale avec Minko. Pour plus d'infos tu peux lire la première étape du tutoriels "Work with vertex attributes in the fragment shader" sur le Hub.

Le code devrait ressembler à quelque chose comme ça:


var format : VertexFormat = new VertexFormat(
  VertexComponent.XYZ,
  VertexComponent.UV,
  VertexComponent.NORMAL
);

var indices : IndexStream = new IndexStream(new <uint>[
  1, 0, 3, 1, 3, 2
]);

var frontVertexStream : VertexStream = new VertexStream(null, format);

// utiliser un VertexIterator n'est pas l'option la plus performante mais:
// - c'est beaucoup plus clair à lire/écrire
// - la différence en performance ne sera absolument pas visible dans
//   le cas présent car on ne fait presque rien au final
var frontVertices : VertexIterator = new VertexIterator(frontVertexStream);

// top left
frontVertices[0] = {x: -0.5, y: 0.5,  z: -0.5, u: 0.0, v: 0.0, nx: 0.0, ny: 0.0, nz: -1.0};
// top right
frontVertices[1] = {x: 0.5,  y: 0.5,  z: -0.5, u: 1.0, v: 0.0, nx: 0.0, ny: 0.0, nz: -1.0};
// bottom right
frontVertices[2] = {x: 0.5,  y: -0.5, z: -0.5, u: 1.0, v: 1.0, nx: 0.0, ny: 0.0, nz: -1.0};
// bottom left
frontVertices[3] = {x: -0.5, y: -0.5, z: -0.5, u: 1.0, v: 0.0, nx: 0.0, ny: 0.0, nz: -1.0};

var frontMesh : IMesh = new Mesh(frontVertexStream, indices);

// faire de même avec les 5 faces restantes...

var cube : Group = new Group(
  frontTexture,
  frontMesh,
  backTexture,
  backMesh,
  leftTexture,
  leftMesh,
  rightTexture,
  rightMesh,
  topTexture,
  topMesh,
  bottomTexture,
  bottomMesh
);
 

Ici je mets tout dans un Group pour que ça soit facile à ajouter/retirer de la scène.
Si tu veux pouvoir déplacer le "cube", utilise un TransformGroup, si tu veux lui appliquer un effet particulier, utilise un EffectGroup, etc... A noter également que chaque face peut être elle même stockée dans un sous groupe pour avoir le même genre de traitement (par exemple un effet différent par face).

C'est du code pas testé, mais à priori pas d'erreurs :)
N'hésite pas si tu as d'autres questions ! Et si tu y arrives ça serait sympa de poster le code que tu as utilisé et le résultat que tu obtiens :P

a+

#3 pol2095

  • Members
  • PipPipPipPipPipPipPipPip
  • 1786 messages

Posté 03 January 2012 - 13:52 PM

j'ai cette erreur

Citation

Erreur: Contrainte implicite d'une valeur du type aerys.minko.type.stream.iterator:VertexIterator vers un type sans rapport aerys.minko.type.stream:IVertexStream.

var frontMesh : IMesh = new Mesh(frontVertices, indices);

Modifié par pol2095, 03 January 2012 - 13:52 PM.


#4 Jean-Marc Le Roux

    Ceinture Noire

  • Minko
  • PipPipPipPipPipPipPip
  • 210 messages

Posté 03 January 2012 - 15:13 PM

Voir le messagepol2095, le 03 January 2012 - 13:52 PM, dit :

j'ai cette erreur

C'était juste une petite faute de frappe... c'est corrigé dans mon post précédent normalement.

a+

#5 pol2095

  • Members
  • PipPipPipPipPipPipPipPip
  • 1786 messages

Posté 03 January 2012 - 15:28 PM

ne faut-il pas plutôt mettre
var frontVertices : VertexIterator = new VertexIterator(frontVertexStream);
à la place de
var frontVertices : VertexIterator = new VertexIterator(vertexStream);

autre question, comment on arrive à frontTexture ?

#6 pol2095

  • Members
  • PipPipPipPipPipPipPipPip
  • 1786 messages

Posté 03 January 2012 - 21:03 PM

j'ai utilisé
var cube : Group = new Group(
  new BitmapTexture( new ASSET_BOX().bitmapData ),
  frontMesh,...

mais l'image est illisible

#7 pol2095

  • Members
  • PipPipPipPipPipPipPipPip
  • 1786 messages

Posté 04 January 2012 - 00:14 AM

je voudrais également aussi me servir de PickableGroup pour mettre un écouteur CLICK sur mon cube, comment m'y prendre ?

#8 Jean-Marc Le Roux

    Ceinture Noire

  • Minko
  • PipPipPipPipPipPipPip
  • 210 messages

Posté 04 January 2012 - 00:47 AM

Voir le messagepol2095, le 03 January 2012 - 21:03 PM, dit :

j'ai utilisé
var cube : Group = new Group(
  new BitmapTexture( new ASSET_BOX().bitmapData ),
  frontMesh,...

mais l'image est illisible

Pour charger les fichiers, le mieux c'est d'utiliser LoaderGroup qui fait tout à votre place.
Dans le cas d'une texture embed, tu peux suivre ce qui est indiqué dans le tutoriel "Load an embedded 3DS file with an embedded texture" sur le Hub.

Jusqu'ici tout ce qui est disponible est au milieu du code concernant le chargement des 3ds/Collada. J'ai donc écrit un tutoriel centré uniquement sur le chargement de textures:

"Load external and embedded textures" sur le Hub

J'espère que ça aidera :)

Citation

je voudrais également aussi me servir de PickableGroup pour mettre un écouteur CLICK sur mon cube, comment m'y prendre ?

As-tu regardé le code de la démo gravity ?

Pour utiliser le picking il faut 2 choses:
- installer le picking visitor quand le Viewport est initialisé
- utiliser des PickableGroup et écouter les MouseEvent dessus

Là tout de suite je n'ai pas le temps de faire un tuto. là dessus mais je te conseille de faire une demande sur le sujet prévu à cet effet pour m'y faire penser :)

a+

#9 pol2095

  • Members
  • PipPipPipPipPipPipPipPip
  • 1786 messages

Posté 04 January 2012 - 07:32 AM

il manquait le picking visitor, ça progresse, merci.

#10 pol2095

  • Members
  • PipPipPipPipPipPipPipPip
  • 1786 messages

Posté 04 January 2012 - 18:32 PM

est-il possible de savoir avec Minko si on utilise la carte graphique ou le software ?

#11 pol2095

  • Members
  • PipPipPipPipPipPipPipPip
  • 1786 messages

Posté 04 January 2012 - 21:23 PM

j'ai des faces qui sont visibles en front, comment faire pour qu'elles soient visibles en back ?

#12 pol2095

  • Members
  • PipPipPipPipPipPipPipPip
  • 1786 messages

Posté 04 January 2012 - 23:00 PM

Voir le messagepol2095, le 04 January 2012 - 18:32 PM, dit :

est-il possible de savoir avec Minko si on utilise la carte graphique ou le software ?

Viewport.renderMode


#13 pol2095

  • Members
  • PipPipPipPipPipPipPipPip
  • 1786 messages

Posté 05 January 2012 - 00:14 AM

Citation

j'ai des faces qui sont visibles en front, comment faire pour qu'elles soient visibles en back ?
à oublier

Maintenant, je voudrais détecter quand mon cube passe derrière la caméra.

Modifié par pol2095, 05 January 2012 - 00:18 AM.


#14 pol2095

  • Members
  • PipPipPipPipPipPipPipPip
  • 1786 messages

Posté 05 January 2012 - 15:27 PM

une autre question sur le minko-picking :
je trouve que la main met un peu de temps à apparaître sur mon cube.

et est-il possible d'ajouter un ContextMenu spécifique à mon cube ?

#15 pol2095

  • Members
  • PipPipPipPipPipPipPipPip
  • 1786 messages

Posté 08 January 2012 - 09:30 AM

je voudrais maintenant pouvoir faire avancer mon cube, comment procéder ?
merci

#16 pol2095

  • Members
  • PipPipPipPipPipPipPipPip
  • 1786 messages

Posté 08 January 2012 - 10:26 AM

j'ai utilisé
cube.transform.appendTranslation(.01)

le pb, si je pivote mon cube de 45°, mon cube va partir vers l'arrière, je voudrais qu'il défile horizontalement sur l'axe des abcisses sans partir vers le fond.

merci

#17 pol2095

  • Members
  • PipPipPipPipPipPipPipPip
  • 1786 messages

Posté 08 January 2012 - 10:45 AM

je bougeais la caméra au lieu de bouger le cube

peut-on grouper ces 2 lignes de code sur une seule ?
cube.transform.appendRotation((stage.mouseY - _cursor.y) * .01, ConstVector4.X_AXIS);
cube.transform.appendRotation((stage.mouseX - _cursor.x) * .01, ConstVector4.Y_AXIS);


#18 Jean-Marc Le Roux

    Ceinture Noire

  • Minko
  • PipPipPipPipPipPipPip
  • 210 messages

Posté 08 January 2012 - 12:33 PM

Voir le messagepol2095, le 08 January 2012 - 10:45 AM, dit :

je bougeais la caméra au lieu de bouger le cube

peut-on grouper ces 2 lignes de code sur une seule ?
cube.transform.appendRotation((stage.mouseY - _cursor.y) * .01, ConstVector4.X_AXIS);
cube.transform.appendRotation((stage.mouseX - _cursor.x) * .01, ConstVector4.Y_AXIS);

Non, mais il y'a une raison tout à fait logique: l'ordre des transformations est important.
Pour mieux comprendre comment ça fonctionne, je te suggère deux tutoriaux:

Move objects with the keyboard
Build and animate a 3D atom

Citation

je trouve que la main met un peu de temps à apparaître sur mon cube.

Le premier argument du constructeur du PickingVisitor détermine la réactivité du picking. Dans la démo on a mis 5, ça veut dire que le picking sera effectué toutes les 5 frames. Si tu mets 1, le picking sera effectué à toutes les frames. Mais attention, ça coûte cher !

La technique du picking est expliquée dans mes slides de Back From MAX, ils seront en ligne cet après midi.

Citation

et est-il possible d'ajouter un ContextMenu spécifique à mon cube ?

La propriété "targent" du MouseEvent que tu récupères au clic est le PickableGroup sur lequel tu as écouté l'event (normal...). Donc j'imagine qu'à partir de là oui, tu peux modifier un peu tout ce que tu veux en fonction de la valeur de la target...

a+

#19 pol2095

  • Members
  • PipPipPipPipPipPipPipPip
  • 1786 messages

Posté 08 January 2012 - 12:40 PM

ok merci.

une autre question, je voudrais placer mon cube au point (20, 50).
Comment m'y prendre ?

en fait je veux faire un dragAndDrop de mon cube
comment faire pour récupérer les coordonnées globaux et taille de mon cube sur le stage : x, y, width, height

#20 pol2095

  • Members
  • PipPipPipPipPipPipPipPip
  • 1786 messages

Posté 09 January 2012 - 18:14 PM

quand je fais
cube.transform.getTranslation().x
qu'est ce que je récupère exactement ?
merci

#21 pol2095

  • Members
  • PipPipPipPipPipPipPipPip
  • 1786 messages

Posté 10 January 2012 - 12:31 PM

quand on clique sur la scène, y-a-t-il un moyen de connaître la distance entre le point où on a cliqué et mon cube ?

#22 pol2095

  • Members
  • PipPipPipPipPipPipPipPip
  • 1786 messages

Posté 11 January 2012 - 21:22 PM

bon j'ai réussi à créer mon cube mais ça manque de fluidité, c'est une catastrophe, d'où peut venir le pb.

#23 Jean-Marc Le Roux

    Ceinture Noire

  • Minko
  • PipPipPipPipPipPipPip
  • 210 messages

Posté 12 January 2012 - 10:39 AM

Voir le messagepol2095, le 08 January 2012 - 12:40 PM, dit :

une autre question, je voudrais placer mon cube au point (20, 50).
Comment m'y prendre ?

Le mieux c'est d'utiliser la méthode Matrix4x4.setTranslation(x, y, z) sur la propriété "transform" du TransformGroup que tu veux déplacer. Si tu veux déplacer le cube "tout entier", alors il suffit de mettre les 6 faces dans un même TransformGroup et de le déplacer comme évoqué précédemment (exactement comme quand tu mets plusieurs Sprite dans un Sprite parent pour les déplacer ensemble):


var cube : TransformGroup = new TransformGroup(
  frontTexture,
  frontMesh,
  backTexture,
  backMesh,
  leftTexture,
  leftMesh,
  rightTexture,
  rightMesh,
  topTexture,
  topMesh,
  bottomTexture,
  bottomMesh
);

cube.transform.setTranslation(20, 50);
 

Citation

en fait je veux faire un dragAndDrop de mon cube

Ca c'est beaucoup plus compliqué : il y'a plein de manières d'envisager le drag'n'drop en 3D.
Le plus intuitif à mon avis c'est de faire comme suit:
- au clic de la souris, on récupère le centre de l'objet cliqué
- on calcule ensuite le plan qui "fait face" à la caméra et contient le centre de l'objet
- on déplace l'objet en le forçant à rester dans le plan calculé à l'étape précédente

Citation

comment faire pour récupérer les coordonnées globaux et taille de mon cube sur le stage : x, y, width, height

Tu as tout plein d'explication à ce sujet dans le post suivant :

http://flash.mediabo...post__p__849273

En gros, il faut mettre un objet GlobalTransformGroup dans ta scène à l'endroit où tu veux être capable de récupérer la transformation globale.

Du coup ton cube devient plutôt quelque chose comme ça:


var cube : TransformGroup = new TransformGroup(
  new GlobalTransformGroup(
    frontTexture,
    frontMesh,
    backTexture,
    backMesh,
    leftTexture,
    leftMesh,
    rightTexture,
    rightMesh,
    topTexture,
    topMesh,
    bottomTexture,
    bottomMesh
  )
);
 

Citation

quand on clique sur la scène, y-a-t-il un moyen de connaître la distance entre le point où on a cliqué et mon cube ?
Une fois que tu as la transformation globale, il suffit de calculer la distance entre la caméra et l'objet:


var localToGlobal : Matrix4x4 = GlobalTransformGroup(cube[0]);
var worldPosition : Vector4 = localToGlobal.getTranslation();
var distance : Number = Vector4.distance(camera.position, worldPosition);
 

Si ta caméra est elle aussi dans un TransformGroup, alors il faut récupérer la position globale de la caméra en utilisant la même technique (à savoir mettre l'objet camera dans un GlobalTransformGroup).

Citation

bon j'ai réussi à créer mon cube mais ça manque de fluidité, c'est une catastrophe, d'où peut venir le pb.

Ca peut venir de précisément 483 causes différentes !
Non sérieusement sans le code je ne peux pas te dire :) Il se peut tout simplement que l'accélération matérielle ne soit pas activée ou alors que tu abuses du picking...

#24 pol2095

  • Members
  • PipPipPipPipPipPipPipPip
  • 1786 messages

Posté 12 January 2012 - 15:44 PM

C'est le picking qui ralentit l'animation, avec un cube simple quand on passe en fullscreen, c'est l'horreur, le cube bouge à peine, mon code est-il bon ?
si on met useHandCursor = true, c'est encore pire.

package
{
    import aerys.minko.scene.node.camera.ArcBallCamera;
    import aerys.minko.scene.node.mesh.primitive.CubeMesh;
    import aerys.minko.scene.node.texture.ColorTexture;
    import aerys.minko.render.Viewport;
    import aerys.minko.scene.node.group.Group;
    import aerys.minko.scene.node.group.PickableGroup;
    import aerys.minko.scene.visitor.PickingVisitor;
         
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.events.MouseEvent;
    import flash.geom.Point;
    import flash.text.TextField;
     
    public class Main extends Sprite
    {

        private var _viewport   : Viewport      = new Viewport();
        private var _camera     : ArcBallCamera  = new ArcBallCamera();
        private var _scene      : Group         = new Group(_camera);
        private var _cursor     : Point             = new Point();
               
        public var pleinEcran:PleinEcran = new PleinEcran();
         
        public function Main() :void
        {
                addEventListener(Event.ADDED_TO_STAGE, initialize);
        }
        private function viewportInitHandler(event : Event) : void
        {
                _viewport.visitors[2] = _viewport.visitors[1];
                _viewport.visitors[1] = new PickingVisitor(5);
        }
        private function initialize(event : Event) : void
        {
            _viewport.addEventListener(Event.INIT, viewportInitHandler);
            var cube : PickableGroup = new PickableGroup(
                new ColorTexture(0xff00ff),
                CubeMesh.cubeMesh
            );
            //cube.useHandCursor = true;
            _scene.addChild(cube);
             
            _camera.distance = 3.;
             
            stage.addChild(_viewport);
                       
            pleinEcran.x=356,25;
            pleinEcran.y=198,85;
            pleinEcran.scaleX=pleinEcran.scaleY=0.281;
            addChild(pleinEcran);
                       
            addEventListener(Event.ENTER_FRAME, enterFrameHandler);
            stage.addEventListener(MouseEvent.MOUSE_MOVE, mouseMoveHandler);
            pleinEcran.addEventListener(MouseEvent.CLICK, mouseDownHandlerFsc);
        }
         
        protected function enterFrameHandler(event : Event) : void
        {
            _viewport.render(_scene);
        }
        private function mouseMoveHandler(event : MouseEvent) : void
        {
            if (event.buttonDown)
            {
                _camera.rotation.y -= (event.stageX - _cursor.x) * .01;
                _camera.rotation.x -= (event.stageY - _cursor.y) * .01;
            }
             
            _cursor.x = event.stageX;
            _cursor.y = event.stageY;
        }
               
        import flash.display.StageDisplayState;
        public function mouseDownHandlerFsc(event:MouseEvent):void {
                if(stage.displayState == "normal") {
                        stage.displayState = StageDisplayState.FULL_SCREEN;
                }
                        else {
                                stage.displayState = StageDisplayState.NORMAL;
                        }
        }
    }
}

Modifié par pol2095, 12 January 2012 - 15:47 PM.


#25 Jean-Marc Le Roux

    Ceinture Noire

  • Minko
  • PipPipPipPipPipPipPip
  • 210 messages

Posté 12 January 2012 - 21:11 PM

Voir le messagepol2095, le 12 January 2012 - 15:44 PM, dit :

C'est le picking qui ralentit l'animation, avec un cube simple quand on passe en fullscreen, c'est l'horreur, le cube bouge à peine, mon code est-il bon ?

Vu que tu n'as mis aucun listener sur le PickableGroup, si useHandCursor = false alors le picking ne fait rien et ne coûte rien. Et d'ailleurs chez moi ça consomme 0% de CPU ce qui est plutôt logique puisque ça ne fait que dessiner un cube :)

Citation

si on met useHandCursor = true, c'est encore pire.

Si tu mets useHandCursor = true, alors là le picking marche. De plus, comme on doit se servir des mouse out/over pour savoir quel curseur afficher, le picking passe dés que la souris bouge. Donc mettre useHandCursor = true fait que le picking va éventuellement couter cher.

Mais même en mettant useHandCursor = true, j'ai toujours 0% de CPU...

Quelle est ta configuration ?

a+

#26 pol2095

  • Members
  • PipPipPipPipPipPipPipPip
  • 1786 messages

Posté 13 January 2012 - 00:17 AM

un truc bizarre, j'ai l'impression que
stage.addChild(_viewport);
redimensionne mon stage sous ie, stage.stageWidth vaut 400 avant et 500 après ?

#27 pol2095

  • Members
  • PipPipPipPipPipPipPipPip
  • 1786 messages

Posté 13 January 2012 - 13:35 PM

configuration :

- windows 7 64 bits
- Intel core dual CPU E2200 @2.20 Ghz 2.20 Ghz
- RAM 2,00 Go
- ATI RADEON HD 2400 Pro

#28 Jean-Marc Le Roux

    Ceinture Noire

  • Minko
  • PipPipPipPipPipPipPip
  • 210 messages

Posté 13 January 2012 - 14:56 PM

Voir le messagepol2095, le 13 January 2012 - 13:35 PM, dit :

- ATI RADEON HD 2400 Pro

Ta carte n'est peut-être pas assez récente.
Ca dit quoi quand tu traces viewport.renderMode ?

#29 pol2095

  • Members
  • PipPipPipPipPipPipPipPip
  • 1786 messages

Posté 13 January 2012 - 15:29 PM

directX9 (direct blitting)

la ds3 tourne sans pb, mais il n'y a pas de picking

Modifié par pol2095, 13 January 2012 - 15:31 PM.


#30 Jean-Marc Le Roux

    Ceinture Noire

  • Minko
  • PipPipPipPipPipPipPip
  • 210 messages

Posté 13 January 2012 - 21:07 PM

Voir le messagepol2095, le 13 January 2012 - 15:29 PM, dit :

directX9 (direct blitting)

la ds3 tourne sans pb, mais il n'y a pas de picking

Si tu ne mets pas useHandCursor à true dans ton exemple, il n'y a normalement pas de picking non plus puisque tu n'as mis aucun listener. Tu pourrais profiler pour me dire ce qui prend du CPU stp ?

a+

#31 pol2095

  • Members
  • PipPipPipPipPipPipPipPip
  • 1786 messages

Posté 14 January 2012 - 00:29 AM

tu as raison, avec useHanderCursor=false, ça fonctionne correctement
par contre mon cube disparaît un court instant quand je clique dessus
cube.addEventListener(MouseEvent.MOUSE_DOWN, mouseDownHandler);

Modifié par pol2095, 14 January 2012 - 00:29 AM.


#32 pol2095

  • Members
  • PipPipPipPipPipPipPipPip
  • 1786 messages

Posté 15 January 2012 - 00:57 AM

quand useHanderCursor=true, le cpu monte à 50% en fullScreen, le picking crée des bitmapData ?

si useHanderCursor=false, en fullScreen
cube.addEventListener(MouseEvent.MOUSE_DOWN, mouseDownHandler);
met 3 secondes pour être détecté, et l'animation clignote.

j'ai testé Angry birds qui tourne avec Stage3D (Starling je pense) et je n'ai pas remarqué de pb avec le picking.

Modifié par pol2095, 15 January 2012 - 00:58 AM.


#33 Jean-Marc Le Roux

    Ceinture Noire

  • Minko
  • PipPipPipPipPipPipPip
  • 210 messages

Posté 15 January 2012 - 12:54 PM

Voir le messagepol2095, le 14 January 2012 - 00:29 AM, dit :

tu as raison, avec useHanderCursor=false, ça fonctionne correctement
par contre mon cube disparaît un court instant quand je clique dessus
cube.addEventListener(MouseEvent.MOUSE_DOWN, mouseDownHandler);

Ce bug a - à priori - été résolu dans la v2.

Citation

j'ai testé Angry birds qui tourne avec Stage3D (Starling je pense) et je n'ai pas remarqué de pb avec le picking.

Il existe différentes manières de faire du picking.
En l'occurrence, faire du picking 2D sur des quads ne coûte rien (même fait en crado c'est en complexité linéaire).
Faire du picking 3D en gérant des occluders, des animations par skinning/morphing et j'en passe, coûte beaucoup plus cher :) Théoriquement, la complexité est en 0 (accès direct), le problème c'est que récupérer la bitmap où on fait l'accès direct a un coup prohibitif. Pour cela nous avons demandé aux ingés. de Flash de pouvoir récupérer non pas tout le backbuffer mais seulement une partie (ce qui à priori est possible), et eux mais également la communauté ont répondu "non ça ne sert à rien"... désolé :(

Pour les cas plus simples, on peut implémenter du picking avec des bounding volumes (à l'étude) ou encore implémenter l'optimisation sur la taille du backbuffer dont j'ai parlé à Back From MAX. Le problème, c'est que changer la taille du backbuffer n'est pas si simple que ça puisqu'il y'a pas mal de choses à prendre en compte (par exemple adapter la projection pour ne pas perdre en précision).

Vu que le but premier est d'avoir les évènements de clic et que c'est à priori géré sans aucun soucis de performances nul part, ces modifications ne sont pas une priorité. Mais si quelqu'un fait un patch, on l'intégrera avec plaisir.

a+

#34 pol2095

  • Members
  • PipPipPipPipPipPipPipPip
  • 1786 messages

Posté 15 January 2012 - 16:04 PM

moi j'ai la version 1.2 beta, c'est la v2 ?

#35 pol2095

  • Members
  • PipPipPipPipPipPipPipPip
  • 1786 messages

Posté 16 January 2012 - 21:09 PM

elle est prévue pour quand la v2 ?

Modifié par pol2095, 16 January 2012 - 21:09 PM.


#36 Jean-Marc Le Roux

    Ceinture Noire

  • Minko
  • PipPipPipPipPipPipPip
  • 210 messages

Posté 17 January 2012 - 18:30 PM

Voir le messagepol2095, le 16 January 2012 - 21:09 PM, dit :

elle est prévue pour quand la v2 ?

Très bientôt :) C'est une question de semaines. Mais ça ne réglera ni les problèmes de drivers ni les problèmes de performances du picking quand useHandCursor = true/on utilise les event mouse out/over. On essaiera de faire des optimisations, mais ça ne sera pas fait à la sortie de la v2.

#37 pol2095

  • Members
  • PipPipPipPipPipPipPipPip
  • 1786 messages

Posté 17 January 2012 - 23:03 PM

J'ai testé avec un netbook qui n'utilise pas l'accélération matérielle, et là le picking fonctionne correctement.
bizarre

#38 Jean-Marc Le Roux

    Ceinture Noire

  • Minko
  • PipPipPipPipPipPipPip
  • 210 messages

Posté 18 January 2012 - 12:23 PM

Voir le messagepol2095, le 17 January 2012 - 23:03 PM, dit :

J'ai testé avec un netbook qui n'utilise pas l'accélération matérielle, et là le picking fonctionne correctement.
bizarre

Il peut y avoir une explication tout à fait logique: sans accélération matérielle, l'émulation logicielle travaille sur le CPU et le readback du backbuffer est peut-être plus efficace. Mais ça fonctionne par ce que tu utilises un simple cube: s'il fallait dessiner des choses plus complexe, l'émulation logicielle souffrirait tellement que les performances seraient de toute façon moins bonnes.

Quelle est la configuration dudit netbook ?

Le picking a aujourd'hui deux points faibles:
- il a un visiteur séparé qui fait que cela a un certain coût sur le CPU
- il utilise un backbuffer de la même taille que le viewport

Dans le courant de la v2, nous essaierons d'éliminer définitivement ces points faibles.
Cependant, ces point faibles n'ont normalement aucune incidence si:
- le PickingVisitor est instancié avec un refreshRate bien dosé (>= 3 je dirais)
- l'accélération matérielle fonctionne correctement
- la propriété PickableGroup.useHandCursor est à false
- les events mouse over/out ne sont pas utilisés

Nous ajouterons également du lancé de rayons pour gérer les intersections avec des bounding volumes.
Mais ça ne gère que les cas très simples. Par exemple ça ne prend pas du tout en compte les animations sans un overhead CPU encore bien plus important et avec une précision inexistante par rapport à ce qu'on permet de faire aujourd'hui avec minko-picking.

a+

#39 pol2095

  • Members
  • PipPipPipPipPipPipPipPip
  • 1786 messages

Posté 18 January 2012 - 13:39 PM

configuration du netbook :

- windows 7 starter 32 bits
- Intel Atom CPU N455 @1.66Ghz 1.67 Ghz
- Intel graphics Media Accelerator 3150

j'ai utilisé PickableGroup.useHandCursor=true et mouseDown Event et ça fonctionne correctement en émulation logicielle

par contre il supporte l'accélération matérielle pour webGL mais pas pour Stage3D.

#40 Jean-Marc Le Roux

    Ceinture Noire

  • Minko
  • PipPipPipPipPipPipPip
  • 210 messages

Posté 18 January 2012 - 15:12 PM

Voir le messagepol2095, le 18 January 2012 - 13:39 PM, dit :

j'ai utilisé PickableGroup.useHandCursor=true et mouseDown Event et ça fonctionne correctement en émulation logicielle

Alors ta carte graphique ne doit pas être gérée correctement :(
Comme quoi c'est malheureusement vraiment indépendant de notre volonté au final...

Citation

par contre il supporte l'accélération matérielle pour webGL mais pas pour Stage3D.

Les Intel GMA devraient être supportés par la prochaine MAJ de Flash 11.

a+

#41 pol2095

  • Members
  • PipPipPipPipPipPipPipPip
  • 1786 messages

Posté 18 January 2012 - 16:06 PM

Est-ce que chez vous ça fonctionne correctement : http://telflash.free.fr/minko/

Modifié par pol2095, 18 January 2012 - 16:07 PM.


#42 pol2095

  • Members
  • PipPipPipPipPipPipPipPip
  • 1786 messages

Posté 20 January 2012 - 15:00 PM

@Jean-Marc Le Roux

Pourrais-tu tester si le cube tourne correctement en plein écran chez toi
http://telflash.free.fr/minko/

merci d'avance

#43 Jean-Marc Le Roux

    Ceinture Noire

  • Minko
  • PipPipPipPipPipPipPip
  • 210 messages

Posté 20 January 2012 - 23:58 PM

Voir le messagepol2095, le 20 January 2012 - 15:00 PM, dit :

@Jean-Marc Le Roux

Pourrais-tu tester si le cube tourne correctement en plein écran chez toi
http://telflash.free.fr/minko/

merci d'avance

Ca tourne sans aucun soucis.

a+

#44 pol2095

  • Guests

Posté 25 January 2012 - 13:22 PM

je trouve que les textures de mon cube sont floues, comment faire pour enlever ce flou ?

merci

#45 pol2095

  • Members
  • PipPipPipPipPipPipPipPip
  • 1786 messages

Posté 07 February 2012 - 18:04 PM

quand je fais pivoter un QuadMesh par exemple de 85° suivant l'axe des ordonnées, ma texture est complètement flou, ce qui n'arrive pas avec l'ancienne classe Matrix3D, à quoi est-ce dû ?



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