Aide - Recherche - Membres - Calendrier
Version complète : L'objet est-il masqué ?
Centre de Formation Flash - Forums Adobe Flash > Rich media et intégration > Intégration 3D > Sandy
Steph::.
Bonjour,

Voilà, j'ai fait une petite scène de test si jointe ou j'ai une sphère qui se déplace, et lorsque qu'une partie commence à devenir masquée ( intersect ) elle devient rouge.

J'arrive à détecter si ma sphère commence à être masqué hors de la camera, mais j'aimerais aussi détecter si elle commence à être masqué en passant derrière le cube, mais je n’ai rien trouvé à se sujet, est-ce possible ?

Action Script

package
{
import flash.display.Sprite;
import flash.events.*;
import flash.text.TextField;
import sandy.core.Scene3D;
import sandy.core.data.*;
import sandy.core.scenegraph.*;
import sandy.materials.*;
import sandy.materials.attributes.*;
import sandy.primitive.*;

public class test extends Sprite
{
private var scene:Scene3D;
private var camera:Camera3D;
private var app1:Appearance;
private var app2:Appearance;
private var app3:Appearance;
private var i:Number=0;
private var ObjMove:Sphere;
private var Cube:Box;

public function test()
{
camera = new Camera3D( 400, 400 );
camera.z = -450;
var root:Group = createScene();
scene = new Scene3D( "scene_test", this, camera, root );
addEventListener( Event.ENTER_FRAME, enterFrameHandler );
}

private function createScene():Group
{
var g:Group = new Group();
////////////////////////////////////////////////////////////////////////////////
var materialAttr1:MaterialAttributes = new MaterialAttributes(
new LineAttributes( 0.5, 0x40C89E, 0.4 ),
new LightAttributes( true, 0.1)
);
var material1:Material = new ColorMaterial( 0x31E843, 1, materialAttr1 );
material1.lightingEnable = true;
app1 = new Appearance( material1 );
////////////////////////////////////////////////////////////////////////////////
var materialAttr2:MaterialAttributes = new MaterialAttributes(
new LineAttributes( 0.5, 0x7B3E2F, 0.4 ),
new LightAttributes( true, 0.1)
);
var material2:Material = new ColorMaterial( 0xFF0909, 1, materialAttr2 );
material2.lightingEnable = true;
app2 = new Appearance( material2 );
////////////////////////////////////////////////////////////////////////////////
Cube = new Box( "Cube1",60,60,60);
Cube.appearance = app1;
Cube.rotateY = 45;
Cube.rotateX = 45;
g.addChild( Cube );
////////////////////////////////////////////////////////////////////////////////
ObjMove = new Sphere( "Sphere1",20,20,4);
ObjMove.appearance = app2;
ObjMove.z=100;
g.addChild( ObjMove );
////////////////////////////////////////////////////////////////////////////////
return g;
}

private function enterFrameHandler( event : Event ) : void
{
i+=0.05;
ObjMove.x=250*Math.sin(i);
////////////////////////////////////////////////////////////////////////////////
var C=ObjMove.culled;
if(C=="[sandy.view.CullingState] :: state : intersect")
ObjMove.appearance = app2; else ObjMove.appearance = app1;
INFOS.text=C;
////////////////////////////////////////////////////////////////////////////////
scene.render();

ObjMove.cull(scene, camera.frustrum, camera.matrix, false);
}
}
}
kiroukou
Bonjour,

aucune solution simple pour ce proleme.
Une solution consiserait à prendre les 8 points definissant les extremités de la bounding box, les projeter sur l'ecran afin de definir le rectangle recouvrant l'objet et tester l'intersection des 2 rectangles obtenus pour chacun des objets.

Autrmeent on prend les vertices(en partant de l'objet geometry), on calcule le rectangle à partir des props sx/sy du vertex (si projected == true). Et on fait la meme chose.

Rien de tres complexe, mais c le minimum à faire smile.gif
Logic
Bon je lance une connerie.

Est-ce que faire des hitTest entre container ne pourraient pas faire l'affaire ?
kiroukou
smile.gif
Et bien c'est meme une très bonne idée wink.gif
Le soucis? Et bien si cela est pour eviter de procéder au tracé de l'objet caché, bah ca pourra pas marcher ^^(ou alors en décalant le tout d'une frame).

Mal à la réflexion je ne suis pas sur que ce soit ce que Steph voulait en fait, donc plutot bonne idée. Seule contrainte, que le useSingleContainer soit à true forcement.

++
Steph::.
Merci, en fait j'avais un objet 2D classique qui suivait l'objet 3D dans ma scène, par dessus en BlendMode, et je voulais le faire disparaitre si l'objet 3d qu'il suivait n'était plus visible.

Alors pour détecter si mon objet passe derrière, en sachant qu'il a une couleur différente des autres objets, je fais simplement une détection des couleurs de l'écran aux coordonnées(2d) de l'objet 3d grâce à la fonction getPixel, et si la couleur de mon objet à changé, alors c'est forcement qu'il est masqué, et ça marche smile.gif


Ceci est une version "bas débit" de notre forum. Pour voir la version complète avec plus d'informations, la mise en page et les images, veuillez cliquer ici.
Invision Power Board © 2001-2009 Invision Power Services, Inc.