jiglib3D + Away3D示例

3D物理引擎示例
本文介绍了一个使用Away3D和JigLib构建的3D物理引擎示例项目。项目中包含了一个带有纹理的3D球体,该球体通过物理引擎实现自然下落并与地面碰撞的效果。文章提供了完整的ActionScript代码,展示了如何初始化3D场景、设置材质和光照、以及如何利用Away3DPhysics插件创建物理对象。
package  
{
    
import away3d.cameras.Camera3D;
    
import away3d.containers.Scene3D;
    
import away3d.containers.View3D;
    
import away3d.core.utils.Cast;
    
import away3d.lights.DirectionalLight3D;
    
import away3d.materials.PhongBitmapMaterial;
    
import away3d.primitives.Sphere;
    
import flash.display.Sprite;
    
import flash.events.Event;
    
import jiglib.math.JNumber3D;
    
import jiglib.physics.PhysicsSystem;
    
import jiglib.physics.RigidBody;
    
import jiglib.plugin.away3d.Away3DPhysics;
    
    [SWF(backgroundColor
="#000000", frameRate="30", width="800", height="600")]
    
    
/**
     * 程序入口
     * 
@author cwin5
     
*/
    
public class TestMain extends Sprite
    {
        
        
// 贴图
        [Embed(source="temp.jpg")]
        
private var textureClass:Class;
        
        
private var _scene:Scene3D = null;
        
private var _camera:Camera3D = null;
        
private var _view:View3D = null;
        
        
private var _ballMaterial:PhongBitmapMaterial = null;
        
        
private var _ball:Sphere = null;
        
        
private var _light:DirectionalLight3D = null;;
        
        
/**
         * 构造
         
*/
        
public function TestMain() 
        {
            init();
        }
        
        
// 初始化
        private function init():void
        {
            initEngine();
            initMaterials();
            initObjects();
            initLights();
            initListeners();
            initJiglibEngine();
        }
        
        
// 初始化引擎
        private function initEngine():void
        {
            _scene 
= new Scene3D();
            _camera 
= new Camera3D();
            _camera.z 
= -500;
            
            _view 
= new View3D();
            _view.scene 
= _scene;
            _view.camera 
= _camera;
            
            addChild(_view);
        }
        
        
/**
         * 初始化材质
         
*/
        
private function initMaterials():void
        {
            _ballMaterial 
= new PhongBitmapMaterial(Cast.bitmap(textureClass));
            _ballMaterial.specular 
= 0.1;
            _ballMaterial.shininess 
= 10;
        }
        
        
/**
         * 初始化对象
         
*/
        
private function initObjects():void
        {
            _ball 
= new Sphere();
            _ball.material 
= _ballMaterial;
            _ball.radius 
= 10;
            _ball.segmentsW 
= 12;
            _ball.segmentsH 
= 10;
            
            _scene.addChild(_ball);
        }
        
        
/**
         * 初始化灯光
         
*/
        
private function initLights():void
        {
            _light 
= new DirectionalLight3D();
            _light.x 
= 1;
            _light.y 
= 1;
            _light.z 
= -1;
            _light.ambient 
= 0.5;
            
            _scene.addChild(_light);
            
        }
        
        
/**
         * 初始化侦听
         
*/
        
private function initListeners():void
        {
            _view.x 
= stage.stageWidth / 2;
            _view.y 
= stage.stageHeight / 2;
            
            addEventListener(Event.ENTER_FRAME , onEnterFrame);
        }
        
        
/**
         * 刷新
         * 
@param    e
         
*/
        
private function onEnterFrame(e:Event):void 
        {
            PhysicsSystem.getInstance().integrate(
0.2);
            _view.render();
        }
        
        
        
////////////////////////////////////////////////////////////////////////////////
        ////////////////////////////////////////////////////////////////////////////////
        ////////////////////////////////////////////////////////////////////////////////
        /**
         * 初始化物理引擎
         
*/
        
private function initJiglibEngine():void
        {
            var physics:Away3DPhysics 
= new Away3DPhysics(_view);
            
            
// 创建圆在物理世界的对象
            var body:RigidBody = physics.createSphereByView(_ball);
            body.y 
= 100;
            body.restitution 
= 1;    // 弹性
            
            
// 创建物理世界地面
            var ground:RigidBody = physics.createGround(null1);
            ground.restitution 
= 1;    // 弹性
        }
        
    }
    
}

 

 

  Away3DPhysics新加的方法:

   

        public function createSphereByView(obj:Mesh):RigidBody
        {
            var r:Number 
= obj["radius"];
            var jsphere:JSphere 
= new JSphere(new Away3dMesh(obj), r);
            addBody(jsphere);
            
return jsphere;

        } 

转载于:https://www.cnblogs.com/cwin5/archive/2009/11/02/1594322.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值