Skip to content

Instantly share code, notes, and snippets.

@johnlindquist
Created November 27, 2008 06:06
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save johnlindquist/29697 to your computer and use it in GitHub Desktop.
Save johnlindquist/29697 to your computer and use it in GitHub Desktop.
package
{
import flash.events.Event;
import flash.events.MouseEvent;
import org.papervision3d.core.geom.renderables.Vertex3D;
import org.papervision3d.core.math.Number3D;
import org.papervision3d.core.math.Plane3D;
import org.papervision3d.core.math.Quaternion;
import org.papervision3d.lights.PointLight3D;
import org.papervision3d.materials.shadematerials.FlatShadeMaterial;
import org.papervision3d.objects.DisplayObject3D;
import org.papervision3d.objects.primitives.Sphere;
import org.papervision3d.view.BasicView;
[SWF(width="640", height="480", backgroundColor="#000000", frameRate="60")]
public class QuaternionExample extends BasicView
{
private const XYPLANE:Number3D = new Number3D(0, 0, 1);
private const RADIUS:Number = 300;
private var plane3D:Plane3D;
private var sphere:Sphere;
private var lag:Number3D;
public function QuaternionExample()
{
lag = new Number3D();
plane3D = new Plane3D(XYPLANE, Number3D.ZERO);
var light:PointLight3D = new PointLight3D();
var material:FlatShadeMaterial = new FlatShadeMaterial(light, 0xcc0000);
sphere = new Sphere(material, 300, 10, 10);
scene.addChild(sphere);
startRendering();
stage.addEventListener(MouseEvent.CLICK, clickHandler);
}
private function clickHandler(event:MouseEvent):void
{
sphere.copyTransform(new DisplayObject3D());
}
override protected function onRenderTick(event:Event=null):void
{
var ray:Number3D = camera.unproject(viewport.containerSprite.mouseX, viewport.containerSprite.mouseY);
ray = Number3D.add(ray, camera.position);
var cameraVertex3D:Vertex3D = new Vertex3D(camera.x, camera.y, camera.z);
var rayVertex3D:Vertex3D = new Vertex3D(ray.x, ray.y, ray.z);
var intersectPoint:Vertex3D = plane3D.getIntersectionLine(cameraVertex3D, rayVertex3D);
var velocityX:Number = intersectPoint.x * .01;
var velocityY:Number = intersectPoint.y * .01;
var velocityZ:Number = intersectPoint.y * .01;
var difference:Number3D = new Number3D(-velocityX, -velocityY, -velocityZ);
var distance:Number = Math.sqrt(difference.x*difference.x+difference.y*difference.y);
var rotationAxis:Number3D = Number3D.cross(difference, XYPLANE);
rotationAxis.normalize();
var rotation:Quaternion = Quaternion.createFromAxisAngle(rotationAxis.x, rotationAxis.y, rotationAxis.z, distance/RADIUS);
rotation.normalize();
sphere.transform.calculateMultiply3x3(rotation.matrix, sphere.transform);
renderer.renderScene(scene, camera, viewport);
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment