.:: Jasa Membuat Aplikasi Website,Desktop,Android Order Now..!! | | Order Now..!! Jasa Membuat Project Arduino,Robotic,Print 3D ::.

away3d 4.0 How i made tire-marks with geometry and jiglib terrain.

0 komentar
If you'd like, click on flash and drive wasd or arrow keys in demo. How i made tire-marks with geometry in away3d 4.0.

It's almost nice, but shadow from tire marks build on terrarium, and FPS slowly a little.


FD project tire mark away3d 4.0 and terrain - source files

Click on stage and drive the car. Its a tail that is following a box..








package {
import away3d.core.base.Geometry;
import away3d.core.math.Matrix3DUtils;
import flash.display.*; import flash.events.*; import flash.system.*; import flash.ui.*; import flash.utils.*; import flash.sampler.*; import flash.net.*; import flash.media.*; import flash.net.*; import flash.external.*; import flash.text.*;
import flash.geom.*;

import adobe.utils.CustomActions;

import away3d.cameras.*;import away3d.containers.*;import away3d.entities.*;
import away3d.core.base.SubGeometry;
import away3d.lights.*;import away3d.materials.*;import away3d.materials.lightpickers.*;
import away3d.materials.methods.*;import away3d.primitives.*;import away3d.textures.*;


import jiglib.cof.JConfig;
import jiglib.debug.Stats;
import jiglib.geometry.*;
import jiglib.math.*;
import jiglib.data.*;
import jiglib.physics.RigidBody;
import jiglib.plugin.away3d4.*;
/**
* away3d-core-fp11_4_0_0_beta.swc
* how to make tyre marks?
* I try geometry. It's almost nice.
*/
public class CarAway3d extends Sprite {
[Embed(source="hightmap3.jpg")]
public var TERRIAN_MAP:Class;

private var container:ObjectContainer3D;
private var carBox:Mesh;
private var plane:Mesh;
private var view:View3D;

private var move:Boolean, revers:Boolean, right:Boolean, left:Boolean;
private var carPos:Point = new Point(), carRotation:Number = 0;

private var param:int = 0;


private var steerMarksBmt:BitmapTexture;

private var planeBitmap:BitmapData;

private var count:int = 0;

private var physics:Away3D4Physics;

private var terrain:JTerrain;
private var terrainObjectContainer3D:ObjectContainer3D;

private var lastPos:Vector3D;

private var markLocalA:Vector3D = new Vector3D( -10, 0, 0);//mark
private var markLocalB:Vector3D = new Vector3D( 10, 0, 0);//mark

private var markLastA:Vector3D;
private var markLastB:Vector3D;

private var MARK_LEN:int = 100;

private var material:TextureMaterial;

private var markCount:int;

private var markVertex:Vector.<Number>;

private var markGeometry:Geometry;

public function CarAway3d() {
stage.align = StageAlign.TOP_LEFT;
stage.scaleMode = StageScaleMode.NO_SCALE;
init();
}

private function init():void {
view = new View3D(); view.camera.lens.far = 5000;
view.camera.moveTo( -170, 1361, -1221); view.camera.rotateTo(45, 2, 0);
addChild(view);
container = new ObjectContainer3D();
view.scene.addChild(container);
var sunLight:DirectionalLight = new DirectionalLight( -1, -0.4, 1);
with (sunLight) { color = 0xFFFF80; castsShadows = true; ambient = diffuse = specular = 1; }
container.addChild(sunLight);
var lightPicker:StaticLightPicker = new StaticLightPicker([sunLight]);

var filteredShadowMapMethod:DitheredShadowMapMethod = new DitheredShadowMapMethod(sunLight);

filteredShadowMapMethod.epsilon = 0.005;

material = myMaterial(0xC0C0C0, lightPicker, filteredShadowMapMethod,false);

container.addChild(carBox = new Mesh(new CubeGeometry(100, 50, 200, 1, 1, 1), material));

material = myMaterial(0xFF8040, lightPicker, filteredShadowMapMethod, false);

//trace(n.length);
JConfig.solverType="FAST";
physics = new Away3D4Physics(view, 8);
physics.engine.setCollisionSystem(true, -500, -500, -500, 20, 20, 20, 100, 100, 100);

lastPos = carBox.position.clone();


var terrainBMD:Bitmap = new TERRIAN_MAP();

terrain = physics.createTerrain(material, terrainBMD.bitmapData, 3000, 300, 3000, 50, 50, 300, 0, false);

//terrainObjectContainer3D = view.scene.getChildAt(1);
//view.scene.removeChild(terrainObjectContainer3D);//terrainObjectContainer3D

material = myMaterial(0xFF8040, lightPicker, filteredShadowMapMethod, false);

var basVertexData:Vector.<Number> = Vector.<Number>([ -50, 0, -50, 50, 0, -50, -50, 0, 50, 50, 0, 50]);

var basIndexArr:Vector.<uint> = Vector.<uint>([0, 2, 3, 0, 3, 1]);

var basUVData:Vector.<uint> = Vector.<uint>([0,1,1,1,0,0,1,0]);


var verDataBig:Vector.<Number> = new Vector.<Number>();
var indDataBig:Vector.<uint> = new Vector.<uint>();
var uvDataBig:Vector.<Number> = new Vector.<Number>();

var c:int = 0;
var a:int = 0;
var b:int = 0;

for (var i:int = 0; i < 1000; i++) {
for (var j:int = 0; j < basVertexData.length; j++) {
if (c == 0) verDataBig.push(basVertexData[j] + a * 120-2000);
if (c == 2) verDataBig.push(basVertexData[j] + b * 120-800);
if (c == 1) verDataBig.push(basVertexData[j]);
c++; if (c >= 3) c = 0;
}


a++;
if (a == 30) {
b++;
a = 0;
}


for (j = 0; j < basUVData.length; j++) uvDataBig.push(basUVData[j]);

for (j = 0; j < basIndexArr.length; j++) indDataBig.push(basIndexArr[j]+i*4);
}

//begin IMPORTANT LINE (DEMONSTRATION HOW IT WORKED
for (i = 0; i < verDataBig.length; i++) verDataBig[i] = 0;//try to comment
//end IMPORTANT LINE (DEMONSTRATION HOW IT WORKED

var myGeometry:Geometry = new Geometry();
var sb:SubGeometry = new SubGeometry();
sb.updateVertexData(verDataBig);
sb.updateUVData(uvDataBig);
sb.updateIndexData(indDataBig);
sb.autoDeriveVertexNormals = true;
sb.autoDeriveVertexTangents = true;
myGeometry.subGeometries.push(sb);
var mesh:Mesh = new Mesh(myGeometry, material);
container.addChild(mesh);

markVertex = verDataBig;
markGeometry = myGeometry;
markCount = 0;



stage.addEventListener(KeyboardEvent.KEY_DOWN, keyHandler);
stage.addEventListener(KeyboardEvent.KEY_UP, keyHandler);
stage.addEventListener(Event.ENTER_FRAME, onEnterFrame);
}

private function myMaterial(color:uint, lightPicker:StaticLightPicker, filteredShadowMapMethod:DitheredShadowMapMethod,glos:Boolean = true):* {
var b:BitmapData;
var m:TextureMaterial = new TextureMaterial(new BitmapTexture(b = new BitmapData(256, 256, true,0x00000000)),false, true);
var sp:Sprite = new Sprite(); sp.graphics.lineStyle(20, 0xFF0000);

sp.graphics.beginFill(0xFFFFFF,1);sp.graphics.drawRect(0, 0, 256, 256);sp.graphics.endFill();

sp.graphics.beginFill(0xFFFFFF,1);sp.graphics.drawCircle(130, 160, 30);sp.graphics.endFill();

b.draw(sp);

m.lightPicker = lightPicker;

m.shadowMethod = filteredShadowMapMethod; with (m) { ambient = 0.5; alpha = 0.5; }

if (glos == false) return m;

b = new TERRIAN_MAP().bitmapData; var bm:BitmapData = new BitmapData(256, 256, true, 0x00000000);
bm.copyPixels(b,new Rectangle(10,10,256,256),new Point(10,10));
b = bm; var cubeMap:BitmapCubeTexture = new BitmapCubeTexture(b, b, b, b, b, b);

var fres:FresnelEnvMapMethod = new FresnelEnvMapMethod(cubeMap)
fres.normalReflectance = .3;fres.fresnelPower = .5;
m.addMethod( fres);

return m;
}

private function onEnterFrame(e:Event):void {
var m:Matrix = new Matrix();
if (move) m.translate(0,10); if (revers) m.translate( 0,-10);
if (right) m.rotate(carRotation-=0.1); if (left) m.rotate( carRotation+=0.1);
if (!left && !right) m.rotate(carRotation);
carPos = carPos.add(m.transformPoint(new Point()));
carBox.rotationY = -carRotation * (180 / Math.PI);
var terrainData:TerrainData = terrain.getHeightAndNormalByPoint(new Vector3D(carPos.x, 0, carPos.y));
//trace(terrainData.height);

carBox.x = carPos.x;
carBox.z = carPos.y;
carBox.y = -terrainData.height;

var rV:Vector3D = terrainData.normal.clone();
rV.scaleBy( 1);
rV = rV.add(carBox.position);

var m3d:Matrix3D = new Matrix3D();
m3d.appendTranslation(carPos.x, -terrainData.height, carPos.y);
carBox.transform = m3d;
carBox.lookAt(rV, Vector3D.Z_AXIS);

m3d = carBox.transform.clone();
m3d.prependRotation( -carRotation * (180 / Math.PI), Vector3D.Z_AXIS);
m3d.prependRotation( 180, Vector3D.Z_AXIS);


m3d.prependRotation( 90, Vector3D.X_AXIS);

carBox.transform = m3d;

//set not null
if (markLastA == null) {
markLastA = carBox.transform.transformVector(markLocalA);;
markLastB = carBox.transform.transformVector(markLocalB);
}

//mark action
if (Vector3D.distance(carBox.position, lastPos)>MARK_LEN) {
//mark action
//trace('mark action');
var markCurA:Vector3D = carBox.transform.transformVector(markLocalA);
var markCurB:Vector3D = carBox.transform.transformVector(markLocalB);

var k:Vector.<Number> = markVertex;
var pos:uint = markCount * 12;//markLastA.x;


k[pos] = markLastA.x;//markLastA;
k[pos + 1] = markLastA.y;//markLastA;
k[pos + 2] = markLastA.z;//markLastA;

pos += 3;

k[pos] = markLastB.x;//markLastB;
k[pos + 1] = markLastB.y;//markLastB;
k[pos + 2] = markLastB.z;//markLastB;

pos += 3;

k[pos] = markCurA.x;;
k[pos + 1] = markCurA.y;;
k[pos + 2] = markCurA.z;;

pos += 3;

k[pos] = markCurB.x;;
k[pos + 1] = markCurB.y;;
k[pos + 2] = markCurB.z;;


var cP:Vector3D = carBox.position.clone();
//cP.y -= 30;
lastPos = cP;
markLastA = carBox.transform.transformVector(markLocalA);
markLastB = carBox.transform.transformVector(markLocalB);

markGeometry.subGeometries[0].updateVertexData(k);
markCount++;
if (markCount >= 1000) markCount = 0;
}
view.render();
}


private function keyHandler(e:KeyboardEvent):void {
var k:int = e.keyCode; //w - 87 a - 65 d - 68 s - 83
if (e.type == KeyboardEvent.KEY_DOWN) var t:Boolean = true;
if (k == Keyboard.UP || k == 87) move = t;
if (k == Keyboard.DOWN || k == 83) revers = t;
if (k == Keyboard.RIGHT || k == 68) right = t;
if (k == Keyboard.LEFT || k == 65) left = t;
}

}
}
Suni

duplicateMovieClip untuk menggandakan movieclip

0 komentar
Saat mengambar, mengcopy sebuah movie clip adalah perkara yang mudah, kita tinggal klik movie clip kemudian ctrl-c lalu ctrl v. Tetapi bila kita ingin menxopy movie clip secara action script? Itu juga perkara gampang, kita tinggal pasang instant name dan dengan satu perintah "duplicateMovieClip" maka movie clip yang kita inginkan sudah terduplikasi. Pengandaan mc secara script ini sangat
Suni

Tawk.to