Example: 2D Coordinates from a 3D Object
March 18, 2008 – 1:23 pm[source:javascript]
package {
import caurina.transitions.Tweener;
import flash.display.Sprite;
import flash.events.Event;
import flash.text.TextField;
import flash.text.TextFieldAutoSize;
import flash.text.TextFormat;
import org.papervision3d.cameras.FreeCamera3D;
import org.papervision3d.materials.MovieMaterial;
import org.papervision3d.objects.primitives.Plane;
import org.papervision3d.render.BasicRenderEngine;
import org.papervision3d.scenes.Scene3D;
import org.papervision3d.view.Viewport3D;
[SWF(width="640", height="480", backgroundColor="0xFFFFFF")]
public class TwoDCoordinates extends Sprite
{
private var viewport:Viewport3D;
private var scene:Scene3D;
private var camera:FreeCamera3D;
private var renderer:BasicRenderEngine;
private var boringSprite:Sprite;
private var spriteMaterial:MovieMaterial;
private var awesomePlane:Plane;
public function TwoDCoordinates()
{
init();
}
private function init():void
{
viewport = new Viewport3D(640,480);
addChild(viewport);
scene = new Scene3D();
camera = new FreeCamera3D();
renderer = new BasicRenderEngine();
createBoringSprite();
createMaterials();
createObjects();
tween3DStuff();
addEventListeners();
}
private function createBoringSprite():void
{
boringSprite = new Sprite();
boringSprite.graphics.beginFill(0×00cc00);
boringSprite.graphics.drawRect(0,0,50,50);
var format:TextFormat = new TextFormat(”Arial”, 32, 0×000000);
var tf:TextField = new TextField();
tf.text = “2D”;
tf.setTextFormat(format);
boringSprite.addChild(tf);
addChild(boringSprite);
}
private function createMaterials():void
{
var sprite:Sprite = new Sprite();
sprite.graphics.beginFill(0xcc0000);
sprite.graphics.drawRect(0, 0, 600, 600);
var format:TextFormat = new TextFormat(”Verdana”, 144, 0×000000);
var tf:TextField = new TextField();
tf.text = “3D”;
tf.autoSize = TextFieldAutoSize.LEFT;
tf.setTextFormat(format)
sprite.addChild(tf);
spriteMaterial = new MovieMaterial(sprite, true);
spriteMaterial.smooth = true;
}
private function createObjects():void
{
awesomePlane = new Plane(spriteMaterial);
scene.addChild(awesomePlane);
}
private function tween3DStuff():void
{
Tweener.addTween(awesomePlane,
{
x:Math.random() * 1500 - 750,
y:Math.random() * 1500 - 750,
z:Math.random() * 750,
onComplete:tween2DStuff,
time:1
});
}
private function tween2DStuff():void
{
Tweener.addTween(boringSprite,
{
x:awesomePlane.screen.x + viewport.width/2,
y:awesomePlane.screen.y + viewport.height/2,
/*Alternatively, you can get the x and y
from the individual vertices of the plane:
awesomePlane.geometry.vertices[vertexIndex].vertex3DInstance.x
*/
onComplete:tween3DStuff,
time:1
});
}
private function addEventListeners():void
{
addEventListener(Event.ENTER_FRAME, render);
}
private function render(e:Event):void
{
renderer.renderScene(scene, camera, viewport);
}
}
}
[/source]

7 Responses to “Example: 2D Coordinates from a 3D Object”
Thanks, now i know that DisplayObject3D have .screen property!
By Exey on Mar 18, 2008
Thanks!!!!! Been looking for this
By Andrew on Mar 19, 2008
Does this actually work regardless of camera angle, etc? DisplayObject3D.screen is an object of type Number3D, which suggests that the x and y are relative to 3D, not 2D, space …
By Joshua Mostafa on Apr 4, 2008
This isn’t working on the latest version of Great White. It seems that the screen property isn’t being populated. I got it to work by changing DisplayObject3D.calculateScreenCoords() to a public function and calling it manually. I wonder if it’s going to get fixed?
By Travis Nelson on Apr 29, 2008
thanks travis,
i’m also using great white (2.0 alpha) and i could solve the problem in the same way. i would be great though, if the screen coordinates would be populated again in a future release.
By Markus Lerner on Apr 29, 2008
Hi,
Is there a way of getting the screen coordinates of an object ( a cube) with Papervision 1.5 ?
Thank you.
By jo3549 on Jun 3, 2008