Search code examples
flashactionscript-3papervision3d

Papervision3D: Making Object Appear Still When Moving Camera


I'd like to keep an object appear to remain in the same place while moving the camera.

I'm using this script http://pv3d.org/2008/11/19/dragging-mouse-for-camera-orbit/ to orbit an object using a mouse drag. But I have an object in the scene that I would like to keep still. How to I do this?

Thanks, Josh


Solution

  • Ok, I browsed through the Camera3D source in Papervision. Here is the implementation for orbit:

                /**
                 * 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 override function orbit(pitch:Number, yaw:Number, useDegrees:Boolean=true, target:DisplayObject3D=null):void
                {
                        target = target || _target;
                        target = target || DisplayObject3D.ZERO;
    
                        if(useDegrees)
                        {
                                pitch *= (Math.PI/180);
                                yaw *= (Math.PI/180);
                        }
    
                        // Number3D.sub
                        var dx                  :Number = target.world.n14 - this.x;
                        var dy                  :Number = target.world.n24 - this.y;
                        var dz                  :Number = target.world.n34 - this.z;
    
                        // Number3D.modulo
                        var distance    :Number = Math.sqrt(dx*dx+dy*dy+dz*dz);
    
                        // Rotations
                        var rx :Number = Math.cos(yaw) * Math.sin(pitch);
                        var rz :Number = Math.sin(yaw) * Math.sin(pitch);
                        var ry :Number = Math.cos(pitch);
    
                        // Move to specified location
                        this.x = target.world.n14 + (rx * distance);
                        this.y = target.world.n24 + (ry * distance);
                        this.z = target.world.n34 + (rz * distance);
    
                        this.lookAt(target);
                }
    

    You could implement this as a helper function for the object you want to keep still. I believe the only camera specific code involved in this function would be the lookAt() function.

    You can then add this before the camera.orbit() in the mouseMove handler and it should stay still with your camera.