Suite à l’article sur comment obtenir les coordonnées 2D du centre d’une Plane, je vous présente ici une astuce pour trouver les coordonnées 2D du somment haut gauche d’une Plane (comme si ce n’était qu’un simple MovieClip aligné en 0,0)
Cet article implique donc que vous ayez lu le précédent article, afin d’aller directement à l’essentiel
Tout d’abord, nous créons un DisplayObject3D (ligne 23), auquel nous ajoutons une Plane.
Comme vous le voyez (ligne 25) notre Plane fait 80 pixels par 80 pixels, pour pouvoir centrer en 0,0 notre plane dans notre DisplayObject3D.
Nous la déplaçons en x de la moitié de sa largeur (ligne 27) et en y (ligne 28) de -(sa hauteur divisé par deux).
Enfin nous activons le autoCalcScreenCoords non pas sur la Plane mais sur le DisplayObject3D (ligne 33).
Tout ceci nous permet avec la même formule que dans l’exemple précédent, de pouvoir positionner notre Sprite sur le sommet haut gauche de notre Plane.
-
package{
-
import org.papervision3d.materials.ColorMaterial;
-
import org.papervision3d.objects.DisplayObject3D;
-
import org.papervision3d.objects.primitives.Plane;
-
import org.papervision3d.view.BasicView;
-
-
import flash.display.Sprite;
-
import flash.events.Event;
-
-
public class BasicScene extends BasicView {
-
-
public function BasicScene()
-
{
-
topLeftPlane();
-
-
startRendering();
-
}
-
-
private function topLeftPlane() : void
-
{
-
var mt : ColorMaterial = new ColorMaterial(0x0000ff);
-
-
do3d = new DisplayObject3D();
-
-
var tlPlane : Plane = new Plane(mt, 80, 80);
-
do3d.addChild(tlPlane);
-
tlPlane.x = 40;
-
tlPlane.y = -40;
-
-
scene.addChild(do3d);
-
do3d.z = ( camera.zoom * camera.focus ) – Math.abs (camera.z);
-
-
do3d.autoCalcScreenCoords = true;
-
-
//—-
-
-
topLeftSprite = new Sprite();
-
topLeftSprite.graphics.beginFill(0xff0000, 0.2);
-
topLeftSprite.graphics.drawRect(0, 0, 40, 40);
-
addChild(topLeftSprite);
-
}
-
-
override protected function onRenderTick(event:Event=null):void
-
{
-
do3d.x -= 0.2;
-
do3d.y -= 0.2;
-
-
topLeftSprite.x = ( do3d.screen.x + (this.width / 2 ) );
-
topLeftSprite.y = ( do3d.screen.y + (this.height / 2 ) );
-
-
//—-
-
-
super.onRenderTick(event);
-
}
-
-
private var do3d : DisplayObject3D;
-
-
private var topLeftSprite : Sprite;
-
}
-
}



Bonjour Ocelyn,
Je suis votre site depuis quelques temps, et j’en viens à utiliser l’autoCalcScreenCoords. Cela fonctionne à merveille, excepté sur deux points :
- la synchro dans le temps n’est pas parfaite (est-ce du a l’approximation de la 3d ou au manque de fps ?)
- lorsque la caméra tourne le dos a la plane, la plane est considérée comme X = 0, c’est à dire… que le sprite collé sur ces coordonnées est face à la caméra…
Connaissez vous une astuce ?