3D комната для новечков урок 2.

Discussion in 'Болталка' started by ^NSA^, 29 Jan 2013.

  1. ^NSA^

    ^NSA^ Elder - Старейшина

    Joined:
    3 Jul 2012
    Messages:
    64
    Likes Received:
    29
    Reputations:
    32
    Первым делом кто еще не читал ознакомится с 1 частью тут
    И так настало время добавит в нашу комнату немного физики без не не как.

    Первый делом нам нужен физический движок под Аway3d.
    И пока их два Awayphysics и Jiglibflash я буду использовать 1 .

    Скачиваем от сюда

    Приступим к установки из awayphysics-core-fp11-master достаем папки ложим нашу src папку пример.

    [​IMG]


    Надо сменить название папки alchemy на cmodule.
    Подключить либу AwayPhysics.swc нажав на кнопку Add SWC. что было так пример .

    [​IMG]


    Пора приступать сперва сделаем что то простое.

    В первом примере мы создаем сферу и куб.

    Кубом можно управлять если куб коснетья сферы то сфера сменить цвет.

    Обнаружение столкновения происходить обработчике событий "boxCol.addEventListener(AWPEvent.COLLISION_ADDED,colIs);"

    Первый делом мы должны создать динамический мир "private var world:AWPDynamicsWorld;"

    [​IMG]


    Потом создать Фигиру столкновение 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 примеру кода
    Куб скользить по полю при этом у него присутсвует сила трения его масса все растет.
    [​IMG]


    пример

    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.
    [​IMG]


    пример

    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г. продолжение следует :D
     
    #1 ^NSA^, 29 Jan 2013
    Last edited: 30 Jan 2013