【AwayPhysics学习笔记】:Away3D物理引擎的简介与使用
首先我們要了解的是AwayPhysics這個物理引擎并不是重頭開始寫的新物理引擎,而是使用Flascc技術把一個已經很成熟的Bullet物理引擎引入到了Flash中,同時為了讓as3可以使用這個C++開發的物理引擎,AwayPhysics庫編寫了一些必要的AS3類使我們可以方便的使用它。
而為了方便區分和使用AwayPhysics里的所有類都使用了AWP作為類名前綴。
?
創建物理世界
要模擬一個物理世界,首先需要創建一個AWPDynamicsWorld的對象,該對象類似于Away3D中創建3D世界的View3D對象,同時每幀也需要類似View3D對象調用render方法一樣調用AWPDynamicsWorld對象的step方法;
創建方法:
1 //獲取物理世界 2 _physicsWorld = AWPDynamicsWorld.getInstance(); 3 //初始化, 主要包括初始化重力等 4 _physicsWorld.initWithDbvtBroadphase();step方法一般使用下面的參數:
1 var _timeStep:Number = 1 / 60;//60表示幀率 2 _physicsWorld.step(_timeStep, 1, _timeStep);關于該方法的更多信息可以參考這里;
而正常來說應該是先調用step方法模擬了物理世界之后在調用View3D的render方法來渲染3D世界;
該類有添加和移除各種剛體的方法,可以方便的添加需要使用物理引擎模擬的對象;
?
輸出調試圖形
如果我們需要查看調試的物件信息(可以查看到添加到物理世界的剛體的坐標系和形狀),可以使用AWPDebugDraw類:
1 private var _debugDraw:AWPDebugDraw; 2 3 //構造函數中創建 4 _debugDraw = new AWPDebugDraw(_view, _physicsWorld); 5 _debugDraw.debugMode |= AWPDebugDraw.DBG_DrawTransform; 6 7 //幀事件方法中調用繪制 8 _debugDraw.debugDrawWorld();需要注意的一點是,debugDrawWorld這個方法會嚴重拉低運行的幀率,當然作為調試工具,我們不需要高效的運行效率,需要調試時別忘了這個類哦。
?
基礎使用簡介
我們搭建好了物理世界后就可以向物理世界中添加對象了:
- 首先,AwayPhysics提供了可以用來進行碰撞檢測的多種3D形狀,存放在awayphysics.collision.shapes包中,我們可以根據需要創建適合的碰撞形狀;
- 然后,我們需要添加一個剛體(AWPRigidBody),將我們的碰撞形狀和3D顯示對象進行綁定;
- 最后,我們可以調整剛體的各種屬性(如果調整剛體的坐標旋轉等信息會實時同步到該剛體綁定的3D對象中),添加到物理世界中即可,當我們的剛體添加到物理世界后他的格子狀態就都由物理引擎來模擬了;
示例代碼:
1 //創建地面 Mesh 2 var material:ColorMaterial = new ColorMaterial(0x252525); 3 material.lightPicker = lightPicker; 4 var mesh:Mesh = new Mesh(new PlaneGeometry(50000, 50000), material); 5 mesh.mouseEnabled = true; 6 mesh.addEventListener(MouseEvent3D.MOUSE_UP, onMouseUp); 7 _view.scene.addChild(mesh); 8 9 //創建地面形狀和剛體 10 var groundShape:AWPStaticPlaneShape = new AWPStaticPlaneShape(new Vector3D(0, 1, 0)); 11 var groundRigidbody:AWPRigidBody = new AWPRigidBody(groundShape, mesh, 0); 12 //添加到物理世界 13 _physicsWorld.addRigidBody(groundRigidbody);?
碰撞檢測
要接收碰撞檢測事件需要開啟一下標志,這樣就可以接收事件了:
1 //開啟碰撞偵聽, AWPEvent.COLLISION_ADDED 事件被啟用 2 _physicsWorld.collisionCallbackOn = true;碰撞對象:
要使用碰撞檢測我們就不用剛體對象(AWPRigidBody)了,要使用碰撞對象(AWPCollisionObject);
同時添加到物理世界時也要使用addCollisionObject方法;
碰撞對象可以添加多個射線,用于射線碰撞檢測;
碰撞事件:
碰撞事件都被封裝好了,有兩個AWPEvent.COLLISION_ADDED和AWPEvent.RAY_CAST:
- COLLISION_ADDED:當有另一個碰撞物體和自己發生碰撞時會拋出該事件,注意并沒有COLLISION_REMOVED等表示碰撞結束的事件,這是由于每次調用step方法模擬時都會重新運算碰撞,所以如果存在碰撞就會一直拋出該事件。
- RAY_CAST:如果添加過射線,那么射線和其它碰撞對象碰撞時也會受到該事件。
?
游戲應用
我們通過上面的代碼可以模擬真實的物理世界,但這是不夠的,更多的時候我們需要使用物理引擎來幫助我們實現游戲中的邏輯,而常見的需求是賽車游戲(車輛和地面與其它物體的碰撞)和全3D的RPG游戲(人物和高低不平的地面的碰撞)。
賽車:?
AwayPhysics提供了兩個關于賽車的Demo,點擊查看源碼:Demo1、Demo2
由于AwayPhysics已經幫我們封裝好了專門用來控制車輛的類,所以創建一個小賽車的游戲是十分簡單的,下面說說會使用到的類:
車輛控制類:
- AWPCompoundShape:這個類可以添加多個基礎的形狀來達到組合成一個復雜形狀的目的,小車使用該類組合了兩個長方體;
- AWPVehicleTuning:這個類用來設置車輛的調節屬性;
- AWPRaycastVehicle:將AWPVehicleTuning和小車剛體進行綁定的類,并且最終會調用_physicsWorld.addVehicle方法添加到物理世界中;
- AWPRaycastVehicle.addWheel:該方法可以對指定的輪子對象進行綁定;
- AWPRaycastVehicle.getWheelInfo:該方法可以微調每個輪子的屬性;
- AWPRaycastVehicle.applyEngineForce:該方法可以控制指定的輪子的引擎力,即踩油門,設置為負值可以倒車;
- AWPRaycastVehicle.setBrake:該方法可以控制指定的輪子的剎車;
- AWPRaycastVehicle.setSteeringValue:該方法可以控制指定的輪子的轉向,即轉彎;
地形生成類(直接加載模型作為地形):
- AWPBvhTriangleMeshShape:我們將加載好的Mesh的geometry屬性賦值到該對象后,就創建了一個和Mesh對象一致的剛體形狀,再將該對象添加到剛體中即可作為自定義的地形使用。
地形生成類(使用高度圖生成地形):
- AWPTerrain:該對象是一個可視對象,是由一個高度位圖創建的Mesh對象。
- AWPHeightfieldTerrainShape:將我們的AWPTerrain對象賦值到該對象后,就創建了一個和Mesh對象一致的剛體形狀,再將該對象添加到剛體中即可作為自定義的地形使用。
RPG:
AwayPhysics提供了一個關于行走的Demo,點擊查看源碼:Demo
地形生成同上,我們看看不一樣的地方:
- AWPGhostObject:該類用來連接一個形狀對象和一個顯示對象;
- AWPKinematicCharacterController:角色控制類,可以設置一個AWPGhostObject對象作為其控制的對象;
- AWPKinematicCharacterController.setWalkDirection:該方法接收一個3D向量作為移動的距離;
- AWPKinematicCharacterController.jump:該方法可以用來進行跳躍;
?
補充
除了我們談到的幾點外,大家還可以查看示例程序了解更多的使用技巧:
剛體碰撞過濾測試
重力測試
自定義形狀的剛體測試
剛體約束測試
總結
以上是生活随笔為你收集整理的【AwayPhysics学习笔记】:Away3D物理引擎的简介与使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: duilib 修复Text控件无法设置宽
- 下一篇: CDN服务品质协议1