スポンサーサイト

-------- | --:--

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

PV3D アームロボット

2008-01-08 | 20:39

↓のウィンドウをクリックしてフォーカスを移した後、上下左右キーおよび'A','S'キーでアームのジョイントが回転します。
衝突判定等は入っていないので物理的にあり得ない回転になります・・・

メモ:
PaperVision3D 2.0でCylinderクラスを使おうとするとNumberUVクラスがないと言われるので、importするようにした。
winのfirefoxの場合、キーボード押しっぱなしでKEY_DOWNイベントが連続して通知されるが、macのfirefoxだと一度離さないと通知されない。
package {
        import flash.display.*;
        import flash.events.*;
        
        import org.papervision3d.core.*;
        import org.papervision3d.core.math.*;
        import org.papervision3d.scenes.*;
        import org.papervision3d.objects.* ;
        import org.papervision3d.objects.primitives.*;
        import org.papervision3d.cameras.*;
        import org.papervision3d.materials.*;
        import org.papervision3d.materials.shadematerials.*;
        import org.papervision3d.materials.utils.* ;
        import org.papervision3d.view.*;
        import org.papervision3d.render.*;
        import org.papervision3d.lights.*;
        
        [SWF(width="600", height="400", backgroundColor="#ffffff")]
        public class ArmRobot extends Sprite{
                private var renderer:BasicRenderEngine = new BasicRenderEngine();
                private var viewport:Viewport3D = new Viewport3D(600, 800, false, true);
                private var scene:Scene3D = new Scene3D();
                private var camera:FreeCamera3D = new FreeCamera3D();
                private var arm1:Cube;
                private var arm2:Cube;
                private var arm3:Cube;
                private var roter1:Cylinder;
                private var roter2:Cylinder;
                private var roter3:Cylinder;
                
                private var ARM_LEN:int = 300;
                private var W:int = 600;
                private var H:int = 400;
                
                private var linkList:Array = [];
                
                public function ArmRobot():void
                {
                        stage.align = StageAlign.TOP_LEFT;
                        stage.scaleMode = StageScaleMode.NO_SCALE;
                        
                        //viewport.y = 50;
                        addChild(viewport);
                        
                        camera.y = 0;
                        camera.z = -1100;
                        camera.x = 0;
                        camera.focus = 1100;
                        camera.zoom = 1;
                        camera.tilt(5);
                        
                        var bluewire:WireframeMaterial = new WireframeMaterial( 0xff );
                        roter1 = new Cylinder(bluewire, 50,50);
                        roter1.x = 0;
                        roter1.y = 0;
                        scene.addChild(roter1);
                        linkList.push(roter1);
                        
                        var redwire:WireframeMaterial = new WireframeMaterial( 0xff0000 );
                        arm1 = new Cube(new MaterialsList({all:redwire}), 50, 50, ARM_LEN);
                        arm1.x = 0;
                        arm1.y = ARM_LEN/2;
                        scene.addChild(arm1);
                        linkList.push(arm1);
                        
                        roter2 = new Cylinder(bluewire, 50,50);
                        roter2.x = 0;
                        roter2.y = ARM_LEN;
                        roter2.pitch(90);
                        scene.addChild (roter2);
                        linkList.push(roter2);
                        
                        var greenwire:WireframeMaterial = new WireframeMaterial( 0xff00 );
                        arm2 = new Cube(new MaterialsList({all:greenwire}), 50, 50, ARM_LEN);
                        arm2.x = 0;
                        arm2.y = ARM_LEN*3/2;
                        scene.addChild(arm2);
                        linkList.push(arm2);
                        
                        roter3 = new Cylinder(bluewire, 50,50);
                        roter3.x = 0;
                        roter3.y = ARM_LEN*2;
                        roter3.pitch(90);
                        scene.addChild(roter3);
                        linkList.push(roter3);
                        
                        arm3 = new Cube(new MaterialsList({all:greenwire}), 50, 50, ARM_LEN);
                        arm3.x = 0;
                        arm3.y = ARM_LEN*5/2;
                        scene.addChild(arm3);
                        linkList.push(arm3);
                        
                        //camera.target = arm1;
                        renderer.renderScene(scene, camera, viewport);
                        
                        stage.addEventListener(KeyboardEvent.KEY_DOWN, function(e:KeyboardEvent):void{
                                rotate(e.keyCode);
                        });
                }
                private function rotate(keyCode:int):void{
                        
                        switch (keyCode){
                                case 37 :// ←
                                // roter1を回転
                                rotateRoter(roter1, 1, 1);
                                break;
                                case 39 :// →
                                // roter1を回転
                                rotateRoter(roter1, 1, -1);
                                break;
                                case 38 :// ↑
                                // roter2を回転
                                rotateRoter(roter2, 3, 1);
                                break;
                                case 40 :// ↓
                                // roter2を回転
                                rotateRoter(roter2, 3, -1);
                                break;
                                case 65 :// A
                                // roter3を回転
                                rotateRoter(roter3, 5, 1);
                                break;
                                case 83 :// S
                                // roter3を回転
                                rotateRoter(roter3, 5, -1);
                                break;
                        }
                        
                        
                        renderer.renderScene(scene, camera, viewport);
                }
                
                private function rotateRoter(r:Cylinder, index:int, axis:int):void{
                        var before:Matrix3D = Matrix3D.clone(r.transform);
                        before.calculateInverse(before);
                        r.yaw(axis);
                        renderer.renderScene(scene, camera, viewport); // renderSceneを呼ばないと transformが更新されない
                        var after:Matrix3D = Matrix3D.clone(r.transform);
                        
                        var i:int;
                        for(i = index ; i < linkList.length ; i++){
                                update(before, after, linkList[i]);
                        }
                }
                
                private function update(before:Matrix3D, after:Matrix3D, link:DisplayObject3D):void{
                        // DisplayObject3Dの変換行列にbeforeを適用
                        var m:Matrix3D = Matrix3D.clone(link.transform);
                        m.calculateMultiply(before,m);
                        
                        // afterの変換行列を適用
                        m.calculateMultiply(after, m);
                        
                        link.transform = m;
                }
                
        }
}
スポンサーサイト

Comment

Post a comment

Secret

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。