Created
November 27, 2008 06:06
-
-
Save johnlindquist/29697 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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