topical media & game development
student-ar-org-papervision3d-core-proto-CameraObject3D.ax
student-ar-org-papervision3d-core-proto-CameraObject3D.ax
[swf]
[flash]
flex
package org.papervision3d.core.proto
{
import flash.geom.Rectangle;
import org.papervision3d.Papervision3D;
import org.papervision3d.core.culling.IObjectCuller;
import org.papervision3d.core.log.PaperLogger;
import org.papervision3d.core.math.Matrix3D;
import org.papervision3d.core.math.Number3D;
import org.papervision3d.core.render.data.RenderSessionData;
import org.papervision3d.objects.DisplayObject3D;
The @ax-student-ar-org-papervision3d-core-proto-CameraObject3D class is the base class for all the cameras that can be placed in a scene.
<p/>
A camera defines the view from which a scene will be rendered. Different camera settings would present a scene from different points of view.
<p/>
3D cameras simulate still-image, motion picture, or video cameras of the real world. When rendering, the scene is drawn as if you were looking through the camera lens.
public class @ax-student-ar-org-papervision3d-core-proto-CameraObject3D extends DisplayObject3D
{
// __________________________________________________________________________
//
This value specifies the scale at which the 3D objects are rendered. Higher values magnify the scene, compressing distance. Use it in conjunction with focus.
public var zoom :Number;
This value is a positive number representing the distance of the observer from the front clipping plane, which is the closest any object can be to the camera. Use it in conjunction with zoom.
<p/>
Higher focus values tend to magnify distance between objects while allowing greater depth of field, as if the camera had a wider lenses. One result of using a wide angle lens in proximity to the subject is an apparent perspective distortion: parallel lines may appear to converge and with a fisheye lens, straight edges will appear to bend.
<p/>
Different lenses generally require a different camera to subject distance to preserve the size of a subject. Changing the angle of view can indirectly distort perspective, modifying the apparent relative size of the subject and foreground.
public var focus :Number;
A Boolean value that determines whether the 3D objects are z-depth sorted between themselves when rendering.
public var sort :Boolean;
public var eye :Matrix3D;
public var viewport :Rectangle;
public var culler :IObjectCuller;
public var yUP:Boolean;
The default position for new cameras.
public static var DEFAULT_POS :Number3D = new Number3D( 0, 0, -1000 );
The default UP vector for new cameras.
public static var DEFAULT_UP:Number3D = new Number3D(0, 1, 0);
The default viewport for new cameras.
public static var DEFAULT_VIEWPORT:Rectangle = new Rectangle(0, 0, 550, 400);
// __________________________________________________________________________
// N E W
// NN NN EEEEEE WW WW
// NNN NN EE WW WW WW
// NNNNNN EEEE WWWWWWWW
// NN NNN EE WWW WWW
// NN NN EEEEEE WW WW
The @ax-student-ar-org-papervision3d-core-proto-CameraObject3D constructor lets you create cameras for setting up the view from which a scene will be rendered.
@param focus This value is a positive number representing the distance of the observer from the front clipping plane, which is the closest any object can be to the camera. Use it in conjunction with zoom.
<p/>
@param zoom This value specifies the scale at which the 3D objects are rendered. Higher values magnify the scene, compressing distance. Use it in conjunction with focus.
<p/>
public function @ax-student-ar-org-papervision3d-core-proto-CameraObject3D( focus:Number=500, zoom:Number=3 )
{
super();
this.x = DEFAULT_POS.x;
this.y = DEFAULT_POS.y;
this.z = DEFAULT_POS.z;
this.zoom = zoom;
this.focus = focus;
this.eye = Matrix3D.IDENTITY;
this.viewport = DEFAULT_VIEWPORT;
this.sort = true;
_ortho = false;
_orthoScaleMatrix = Matrix3D.scaleMatrix(1, 1, 1);
if(Papervision3D.useRIGHTHANDED)
{
DEFAULT_UP.y = -1;
this.yUP = false;
this.lookAt(DisplayObject3D.ZERO);
}
else
this.yUP = true;
}
Lookat.
parameter: targetObject
parameter: upAxis
public override function lookAt(targetObject:DisplayObject3D, upAxis:Number3D=null):void
{
if(this.yUP)
{
super.lookAt(targetObject, upAxis);
}
else
{
super.lookAt(targetObject, upAxis || DEFAULT_UP);
}
}
Orbits the camera around the specified target. If no target is specified the
camera's #target property is used. If this camera's #target property equals null
the camera orbits the origin (0, 0, 0).
@param pitch Rotation around X=axis (looking up or down).
@param yaw Rotation around Y-axis (looking left or right).
@param useDegrees Whether to use degrees for pitch and yaw (defaults to 'true').
@param target An optional target to orbit around.
public function orbit(pitch:Number, yaw:Number, useDegrees:Boolean=true, target:DisplayObject3D=null):void
{
}
Projects vertices.
@param object
@param renderSessionData
public function projectVertices(vertices:Array, object:DisplayObject3D, renderSessionData:RenderSessionData):Number
{
return 0;
}
public function projectFaces(faces:Array, object:DisplayObject3D, renderSessionData:RenderSessionData):Number{
return 0;
}
// ___________________________________________________________________________________________________
// T R A N S F O R M
// TTTTTT RRRRR AA NN NN SSSSS FFFFFF OOOO RRRRR MM MM
// TT RR RR AAAA NNN NN SS FF OO OO RR RR MMM MMM
// TT RRRRR AA AA NNNNNN SSSS FFFF OO OO RRRRR MMMMMMM
// TT RR RR AAAAAA NN NNN SS FF OO OO RR RR MM M MM
// TT RR RR AA AA NN NN SSSSS FF OOOO RR RR MM MM
[internal-use] Transforms world coordinates into camera space.
// TODO: OPTIMIZE (LOW) Resolve + inline
public function transformView( transform:Matrix3D=null ):void
{
if(this.yUP)
{
eye.calculateMultiply(transform || this.transform, _flipY );
eye.invert();
}
else
{
eye.calculateInverse(transform || this.transform);
}
}
static private var _flipY :Matrix3D = Matrix3D.scaleMatrix( 1, -1, 1 );
Rotate the camera in its vertical plane.
<p/>
Tilting the camera results in a motion similar to someone nodding their head "yes".
@param angle Angle to tilt the camera.
public function tilt( angle:Number ):void
{
//if(!_target)
// super.pitch( angle );
}
Rotate the camera in its horizontal plane.
<p/>
Panning the camera results in a motion similar to someone shaking their head "no".
@param angle Angle to pan the camera.
public function pan( angle:Number ):void
{
// if(_target)
// super.yaw( angle );
}
Unproject.
@param mX
@param mY
public function unproject(mX:Number, mY:Number):Number3D
{
var persp:Number = (focus*zoom) / (focus);
var vector:Number3D = new Number3D(mX/persp, -mY/persp, focus);
Matrix3D.multiplyVector3x3(transform, vector);
return vector;
}
Sets the vertical Field Of View in degrees.
@param degrees
public function set fov(degrees:Number):void
{
if(!viewport || viewport.isEmpty())
{
PaperLogger.warning("@ax-student-ar-org-papervision3d-core-proto-CameraObject3D#viewport not set, can't set fov!");
return;
}
var tx :Number = 0;
var ty :Number = 0;
var tz :Number = 0;
if(_target)
{
tx = _target.world.n14;
ty = _target.world.n24;
tz = _target.world.n34;
}
//var vx :Number = this.x - tx;
//var vy :Number = this.y - ty;
//var vz :Number = this.z - tz;
var h:Number = viewport.height / 2;
//var d:Number = Math.sqrt(vx*vx + vy*vy + vz*vz) + this.focus;
//var r:Number = 180 / Math.PI;
var vfov:Number = (degrees/2) * (Math.PI/180);
this.focus = (h / Math.tan(vfov)) / this.zoom;
}
Gets the vertical Field Of View in degrees.
public function get fov():Number
{
if(!viewport || viewport.isEmpty())
{
PaperLogger.warning("@ax-student-ar-org-papervision3d-core-proto-CameraObject3D#viewport not set, can't calculate fov!");
return NaN;
}
var tx :Number = 0;
var ty :Number = 0;
var tz :Number = 0;
if(_target)
{
tx = _target.world.n14;
ty = _target.world.n24;
tz = _target.world.n34;
}
var vx :Number = this.x - tx;
var vy :Number = this.y - ty;
var vz :Number = this.z - tz;
var f :Number = this.focus;
var z :Number = this.zoom;
var d :Number = Math.sqrt(vx*vx + vy*vy + vz*vz) + f; // distance along camera's z-axis
var h :Number = viewport.height / 2;
var r :Number = (180/Math.PI);
return Math.atan((((d / f) / z) * h) / d) * r * 2;
}
Gets the distance to the far plane.
public function get far():Number
{
return _far;
}
Sets the distance to the far plane.
@param value
public function set far(value:Number):void
{
if(value > this.focus)
{
_far = value;
}
}
Gets the distance to the near plane (note that this simply is an alias for #focus).
public function get near():Number
{
return this.focus;
}
Sets the distance to the near plane (note that this is simply an alias for #focus).
@param value
public function set near(value:Number):void
{
if(value > 0)
{
this.focus = value;
}
}
Gets the target for this camera, if any.
returns: DisplayObject3D
public function get target():DisplayObject3D
{
return _target;
}
Sets the target for this camera.
@param object A DisplayObject3D
public function set target(object:DisplayObject3D):void
{
_target = object;
}
Whether this camera uses culling.
returns: Boolean
public function get useCulling():Boolean
{
return _useCulling;
}
Whether this camera uses culling.
public function set useCulling(value:Boolean):void
{
_useCulling = value;
}
Whether this camera uses a projection matrix.
returns: Boolean
public function get useProjectionMatrix():Boolean
{
return _useProjectionMatrix;
}
Whether this camera uses a projection matrix.
public function set useProjectionMatrix(value:Boolean):void
{
_useProjectionMatrix = value;
}
Whether the camera uses orthographic projection.
public function get ortho():Boolean
{
return _ortho;
}
Whether the camera uses orthographic projection.
public function set ortho(value:Boolean):void
{
_ortho = value;
}
The scale of projection when in orthographic mode.
public function get orthoScale():Number
{
return _orthoScale;
}
The scale of projection when in orthographic mode.
public function set orthoScale(value:Number):void
{
_orthoScale = value > 0 ? value : 0.0001;
_orthoScaleMatrix.n11 = _orthoScale;
_orthoScaleMatrix.n22 = _orthoScale;
_orthoScaleMatrix.n33 = _orthoScale;
}
protected var _useCulling : Boolean;
protected var _useProjectionMatrix : Boolean;
protected var _ortho : Boolean;
protected var _orthoScale : Number = 1;
protected var _orthoScaleMatrix : Matrix3D;
protected var _target : DisplayObject3D;
protected var _far : Number;
}
}
(C) Æliens
04/09/2009
You may not copy or print any of this material without explicit permission of the author or the publisher.
In case of other copyright issues, contact the author.