Первым делом кто еще не читал ознакомится с 1 частью тут И так настало время добавит в нашу комнату немного физики без не не как. Первый делом нам нужен физический движок под Аway3d. И пока их два Awayphysics и Jiglibflash я буду использовать 1 . Скачиваем от сюда Приступим к установки из awayphysics-core-fp11-master достаем папки ложим нашу src папку пример. Надо сменить название папки alchemy на cmodule. Подключить либу AwayPhysics.swc нажав на кнопку Add SWC. что было так пример . Пора приступать сперва сделаем что то простое. В первом примере мы создаем сферу и куб. Кубом можно управлять если куб коснетья сферы то сфера сменить цвет. Обнаружение столкновения происходить обработчике событий "boxCol.addEventListener(AWPEvent.COLLISION_ADDED,colIs);" Первый делом мы должны создать динамический мир "private var world:AWPDynamicsWorld;" Потом создать Фигиру столкновение shape:AWPCollisionShape затем еще созадать обьект столкновения AWPCollisionObject. в который добавить эту фигуру и Сетку. Наконец пришло время AWPDynamicsWorld который добавляет в мир этот обьект. пример Code: package { import flash.display.Sprite; import flash.events.Event; import flash.events.KeyboardEvent; import flash.geom.Vector3D; import flash.ui.Keyboard; import away3d.containers.View3D; import away3d.debug.AwayStats; import away3d.entities.Mesh; import away3d.materials.ColorMaterial; import away3d.primitives.CubeGeometry; import away3d.primitives.SphereGeometry; import awayphysics.collision.dispatch.AWPCollisionObject; import awayphysics.collision.shapes.AWPBoxShape; import awayphysics.collision.shapes.AWPCollisionShape; import awayphysics.collision.shapes.AWPSphereShape; import awayphysics.debug.AWPDebugDraw; import awayphysics.dynamics.AWPDynamicsWorld; import awayphysics.events.AWPEvent; [SWF(backgroundColor="#cccccc", frameRate="60", width="600", height="400")] public class MyCol1 extends Sprite { [Embed(source="../embeds/fskin.jpg")] private var CarSkin : Class; private var view:View3D; private var box:Mesh; private var F :Boolean = false; private var D :Boolean = false; private var L :Boolean = false; private var R :Boolean = false; private var timeStep:Number = 1.0 / 60; private var awpBody:AWPCollisionObject; private var world:AWPDynamicsWorld; private var boxCol:AWPCollisionObject; private var ballCol:AWPCollisionObject; private var sDirection : Vector3D = new Vector3D(5, 0, 0); private var sDirection2 : Vector3D = new Vector3D(0, 0, 5); private var ball:Mesh; private var debugDraw:AWPDebugDraw; public function MyCol1() { super(); view = new View3D(); view.camera.y = 100; view.camera.z = -700; world = AWPDynamicsWorld.getInstance(); world.initWithDbvtBroadphase(); world.collisionCallbackOn = true; debugDraw = new AWPDebugDraw(view, world); debugDraw.debugMode |= AWPDebugDraw.DBG_DrawRay; addChild(view); var shape:AWPCollisionShape; var material:ColorMaterial = new ColorMaterial(0x66ccbb); //create box box = new Mesh(new CubeGeometry(),material); view.scene.addChild(box); shape = new AWPBoxShape(); //create collision box boxCol = new AWPCollisionObject(shape,box); boxCol.position = new Vector3D( 400 , 20, -100); //create ball ball = new Mesh(new SphereGeometry(100),new ColorMaterial(0xff0000)); view.scene.addChild(ball); shape = new AWPSphereShape(100); //create collision ball ballCol = new AWPCollisionObject(shape,ball); ballCol.position = new Vector3D( 10, 20, 100); world.addCollisionObject(boxCol); world.addCollisionObject(ballCol); boxCol.addEventListener(AWPEvent.COLLISION_ADDED,colIs); stage.addEventListener(Event.ENTER_FRAME,renders); stage.addEventListener(KeyboardEvent.KEY_DOWN,downKey); stage.addEventListener(KeyboardEvent.KEY_UP,upKey); } private function colIs(event:AWPEvent):void{ trace("collision point in world space: "+event); if (event.collisionObject == ballCol) { ball.material = new ColorMaterial(0xff00ff); } } public function downKey(event:KeyboardEvent):void{ switch(event.keyCode){ case Keyboard.UP: F = true; break; case Keyboard.DOWN: D = true; break; case Keyboard.LEFT: L= true; break; case Keyboard.RIGHT: R = true; break; } } public function upKey(event:KeyboardEvent):void{ switch(event.keyCode){ case Keyboard.UP: F = false; break; case Keyboard.DOWN: D = false; break; case Keyboard.LEFT: L= false; break; case Keyboard.RIGHT: R = false; break; } } public function renders(event:Event):void{ if(L){ //box.moveLeft(5); boxCol.position = boxCol.position.subtract(boxCol.worldTransform.rotationWithMatrix.transformVector(sDirection)); } else if(R){ boxCol.position = boxCol.position.add(boxCol.worldTransform.rotationWithMatrix.transformVector(sDirection)); } else if(F){ boxCol.position = boxCol.position.add(boxCol.worldTransform.rotationWithMatrix.transformVector(sDirection2)); } else if(D){ boxCol.position = boxCol.position.subtract(boxCol.worldTransform.rotationWithMatrix.transformVector(sDirection2)); box.moveBackward(5); } world.step(timeStep); //debugDraw.debugDrawWorld(); view.render(); } } } Еще в динамический мир можно добавлять жесткие тела AWPRigidBody у которых можно настроить разные свойства. Перейдем к 2 примеру кода Куб скользить по полю при этом у него присутсвует сила трения его масса все растет. пример Code: package { import flash.display.Bitmap; import flash.display.Sprite; import flash.events.Event; import flash.events.KeyboardEvent; import flash.geom.Vector3D; import flash.net.URLRequest; import flash.ui.Keyboard; import away3d.containers.ObjectContainer3D; import away3d.containers.View3D; import away3d.core.base.Object3D; import away3d.debug.AwayStats; import away3d.entities.Mesh; import away3d.events.LoaderEvent; import away3d.lights.PointLight; import away3d.loaders.Loader3D; import away3d.loaders.parsers.Parsers; import away3d.materials.ColorMaterial; import away3d.materials.TextureMaterial; import away3d.materials.methods.TerrainDiffuseMethod; import away3d.primitives.ConeGeometry; import away3d.primitives.CubeGeometry; import away3d.primitives.CylinderGeometry; import away3d.primitives.PlaneGeometry; import away3d.textures.BitmapTexture; import awayphysics.collision.dispatch.AWPCollisionObject; import awayphysics.collision.shapes.AWPBoxShape; import awayphysics.collision.shapes.AWPCylinderShape; import awayphysics.collision.shapes.AWPHeightfieldTerrainShape; import awayphysics.collision.shapes.AWPStaticPlaneShape; import awayphysics.debug.AWPDebugDraw; import awayphysics.dynamics.AWPDynamicsWorld; import awayphysics.dynamics.AWPRigidBody; import awayphysics.dynamics.vehicle.AWPRaycastVehicle; import awayphysics.dynamics.vehicle.AWPVehicleTuning; import awayphysics.dynamics.vehicle.AWPWheelInfo; import awayphysics.extend.AWPTerrain; import awayphysics.collision.shapes.AWPCompoundShape; [SWF(backgroundColor="#cccccc", frameRate="60", width="700", height="500")] public class MyCar extends Sprite { private var view:View3D; private var mesh:Mesh; private var debugDraw:AWPDebugDraw; private var physicsWorld:AWPDynamicsWorld; private var loader:Loader3D; private var container:ObjectContainer3D; private var timeStep : Number = 1.0 / 60; private var cubeBody2:AWPRigidBody; private var movex:Vector3D =new Vector3D(-5,0,0); private var cubeBody:AWPRigidBody; public function MyCar() { super(); view = new View3D(); addChild(view); view.camera.z=-600; view.camera.rotationX= 30; view.camera.lens.far = 1000; view.camera.lookAt(new Vector3D()); physicsWorld = AWPDynamicsWorld.getInstance(); physicsWorld.initWithDbvtBroadphase(); debugDraw = new AWPDebugDraw(view, physicsWorld); debugDraw.debugMode |= AWPDebugDraw.DBG_DrawRay; var light:PointLight = new PointLight(); light.y = 1000; view.scene.addChild(light); var cube:Mesh = new Mesh(new CubeGeometry(),new ColorMaterial(0xffff00)); view.scene.addChild(cube); var cube2:Mesh = new Mesh(new CubeGeometry(),new ColorMaterial(0xffff00)); view.scene.addChild(cube2); var cubeShape:AWPBoxShape = new AWPBoxShape (50,80); cubeBody = new AWPRigidBody(cubeShape,cube); cubeBody.position = new Vector3D(0,20,-100); cubeBody2 = new AWPRigidBody(cubeShape,cube2); cubeBody2.position = new Vector3D(300,50,0); var plane:Mesh = new Mesh( new PlaneGeometry(800,800)); view.scene.addChild(plane); var planeShape:AWPStaticPlaneShape = new AWPStaticPlaneShape(); var planeBody:AWPRigidBody = new AWPRigidBody(planeShape,plane,1000); cubeBody2.friction=.3; cubeBody2.ccdMotionThreshold=1; cubeBody2.ccdSweptSphereRadius= 0.5; planeBody.position = new Vector3D(0,-90,0); physicsWorld.addRigidBody(cubeBody); physicsWorld.addRigidBody(cubeBody2); physicsWorld.addRigidBody(planeBody); stage.addEventListener(Event.ENTER_FRAME,loop); } public function loop(event:Event):void{ debugDraw.debugDrawWorld(); physicsWorld.step(timeStep); cubeBody2.x-=1; cubeBody2.z-=1; cubeBody2.mass+=1; view.render(); } } } На последок пример физики на машине, правда с колесами беда может кто найдет как их поставить на место а может ты? можно загрузить колесо отдельно или car.obj. пример Code: package { import flash.display.Bitmap; import flash.display.Sprite; import flash.events.Event; import flash.events.KeyboardEvent; import flash.geom.Vector3D; import flash.net.URLRequest; import flash.ui.Keyboard; import away3d.containers.ObjectContainer3D; import away3d.containers.View3D; import away3d.core.base.Object3D; import away3d.debug.AwayStats; import away3d.entities.Mesh; import away3d.events.LoaderEvent; import away3d.lights.PointLight; import away3d.loaders.Loader3D; import away3d.loaders.parsers.Parsers; import away3d.materials.ColorMaterial; import away3d.materials.TextureMaterial; import away3d.materials.methods.TerrainDiffuseMethod; import away3d.primitives.ConeGeometry; import away3d.primitives.CubeGeometry; import away3d.primitives.CylinderGeometry; import away3d.primitives.PlaneGeometry; import away3d.textures.BitmapTexture; import awayphysics.collision.dispatch.AWPCollisionObject; import awayphysics.collision.shapes.AWPBoxShape; import awayphysics.collision.shapes.AWPCompoundShape; import awayphysics.collision.shapes.AWPCylinderShape; import awayphysics.collision.shapes.AWPHeightfieldTerrainShape; import awayphysics.collision.shapes.AWPStaticPlaneShape; import awayphysics.debug.AWPDebugDraw; import awayphysics.dynamics.AWPDynamicsWorld; import awayphysics.dynamics.AWPRigidBody; import awayphysics.dynamics.vehicle.AWPRaycastVehicle; import awayphysics.dynamics.vehicle.AWPVehicleTuning; import awayphysics.dynamics.vehicle.AWPWheelInfo; import awayphysics.extend.AWPTerrain; [SWF(backgroundColor="#cccccc", frameRate="60", width="700", height="500")] public class Lcar extends Sprite { [Embed(source="../embeds/rock.jpg")] private var Rock : Class; [Embed(source="../embeds/terrain_tex.jpg")] private var HeightMap : Class; [Embed(source="../embeds/fskin.jpg")] private var CarSkin : Class; private var view:View3D; private var mesh:Mesh; private var debugDraw:AWPDebugDraw; private var physicsWorld:AWPDynamicsWorld; private var loader:Loader3D; private var container:ObjectContainer3D; private var timeStep : Number = 1.0 / 60; private var cubeBody:AWPRigidBody; private var carMaterial:TextureMaterial; private var car:AWPRaycastVehicle ; public function Lcar() { super(); view = new View3D(); addChild(view); view.camera.z=-2000; view.camera.y = 2000; view.camera.rotationX = 40; view.camera.lens.far = 100000; //view.camera.lookAt(new Vector3D()); physicsWorld = AWPDynamicsWorld.getInstance(); physicsWorld.initWithDbvtBroadphase(); debugDraw = new AWPDebugDraw(view, physicsWorld); debugDraw.debugMode |= AWPDebugDraw.DBG_DrawRay; var light:PointLight = new PointLight(); light.y = 1000; view.scene.addChild(light); carMaterial = new TextureMaterial(new BitmapTexture(new CarSkin().bitmapData)); var bmaterial : TextureMaterial = new TextureMaterial(new BitmapTexture(new Rock().bitmapData)); //bmaterial.diffuseMethod = terrainMethod; //bmaterial.normalMap = new BitmapTexture(new Normals().bitmapData); bmaterial.ambientColor = 0x202030; bmaterial.specular = .2; var terrainBMD : Bitmap = new HeightMap(); var terrain : AWPTerrain = new AWPTerrain(bmaterial, terrainBMD.bitmapData, 50000, 1200, 50000, 60, 60, 1200, 0, false); view.scene.addChild(terrain); var plane:Mesh = new Mesh( new PlaneGeometry(800,800)); //view.scene.addChild(plane); var terrainShape : AWPHeightfieldTerrainShape = new AWPHeightfieldTerrainShape(terrain); var terrainBody : AWPRigidBody = new AWPRigidBody(terrainShape, terrain, 0); physicsWorld.addRigidBody(terrainBody); stage.addEventListener(Event.ENTER_FRAME,loop); Parsers.enableAllBundled(); loader = new Loader3D(); //loader.load(new URLRequest('../assets/car.obj')); loader.load(new URLRequest('../assets/hamer.obj')); loader.addEventListener(LoaderEvent.RESOURCE_COMPLETE, loaderModel); } private function createCarShape() : AWPCompoundShape { var boxShape1 : AWPBoxShape = new AWPBoxShape(460, 130, 870); var boxShape2 : AWPBoxShape = new AWPBoxShape(340, 20, 500); var carShape : AWPCompoundShape = new AWPCompoundShape(); carShape.addChildShape(boxShape1, new Vector3D(0, 100, 0), new Vector3D()); carShape.addChildShape(boxShape2, new Vector3D(0, 150, -30), new Vector3D()); return carShape; } private function loaderModel(event:LoaderEvent):void{ container = ObjectContainer3D(event.target); view.scene.addChild(container); var mesh : Mesh; for (var i : int = 0; i < container.numChildren; i++) { mesh = Mesh(container.getChildAt(i)); mesh.geometry.scale(40); //mesh.material = carMaterial; } var carShape : AWPCompoundShape = createCarShape(); var carBody : AWPRigidBody = new AWPRigidBody(carShape, container.getChildAt(4), 1200); carBody.activationState = AWPCollisionObject.DISABLE_DEACTIVATION; carBody.linearDamping = 0.1; carBody.angularDamping = 0.1; carBody.position = new Vector3D(100, 1500, 0); //carBody.rotationY=300; physicsWorld.addRigidBody(carBody); var turning : AWPVehicleTuning = new AWPVehicleTuning(); turning.frictionSlip = 2; turning.suspensionStiffness = 100; turning.suspensionDamping = 0.85; turning.suspensionCompression = 0.83; turning.maxSuspensionTravelCm = 20; turning.maxSuspensionForce = 8000; car = new AWPRaycastVehicle(turning, carBody); physicsWorld.addVehicle(car); //bug need fix car.addWheel(container.getChildAt(0), new Vector3D(-110, 80, 170), new Vector3D(0, -1, 0), new Vector3D(-1, 0, 0), 50, 100, turning, true); car.addWheel(container.getChildAt(3), new Vector3D(110, 80, 170), new Vector3D(0, -1, 0), new Vector3D(-1, 0, 0), 50, 100, turning, true); car.addWheel(container.getChildAt(1), new Vector3D(-110, 90, -210), new Vector3D(0, -1, 0), new Vector3D(-1, 0, 0), 50, 100, turning, false); car.addWheel(container.getChildAt(2), new Vector3D(110, 90, -210), new Vector3D(0, -1, 0), new Vector3D(-1, 0, 0), 50, 100, turning, false); for (var i = 0; i < car.getNumWheels(); i++) { var wheel : AWPWheelInfo = car.getWheelInfo(i); wheel.wheelsDampingRelaxation = 4.5; wheel.wheelsDampingCompression = 4.5; wheel.suspensionRestLength1 = 20; wheel.rollInfluence = 0.01; } } public function loop(event:Event):void{ debugDraw.debugDrawWorld(); physicsWorld.step(timeStep); if(car) view.camera.lookAt(car.getRigidBody().position); view.render(); } } } файлы картинок и моделей скачать тут Автор ^NSA^ 2013г. продолжение следует