away3d 4.1.1 shadow jiglib racing smoke
Video of jiglib and away3d demo. I made a test today with latest Away3D 4.1.1 Beta and jiglibflash using only a simple cube and plane.If you want to drive, you can made a click on flash container and drive a car using arrow key and space key for handbrake.
package
{
import away3d.animators.*;import away3d.core.partition.*;
import away3d.events.*;import away3d.cameras.lenses.*;
import away3d.core.base.*;import away3d.core.math.*;
import away3d.library.assets.*;import away3d.debug.*;
import away3d.cameras.*;import away3d.containers.*;import away3d.entities.*;
import away3d.lights.*; import away3d.materials.*;
import away3d.materials.lightpickers.*;
import away3d.materials.methods.*; import away3d.primitives.*;
import away3d.textures.*;import away3d.filters.*;
import away3d.materials.utils.*;import away3d.primitives.data.*;
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 jiglib.cof.*;
import jiglib.debug.*;
import jiglib.geometry.*;
import jiglib.math.*;
import jiglib.data.*;
import jiglib.physics.*;
import jiglib.plugin.away3d4.*;
import jiglib.plugin.*;
import jiglib.vehicles.JCar;
/**
* ...
* @author Lexcuk
*/
public class Away3DJiglibSmokeTesterDoc extends Sprite
{
private var container:ObjectContainer3D;
public var sprite:Sprite;
public var view:View3D;
private var containerArr:Array;
private var hrefTxt:TextField;
private var nArr:Array;
private var camScale:Number = 6;
private var containerScale:Number = 10;
private var sceneMousePosition:Vector3D = new Vector3D();
private var whiteSprite3dSmoke:Sprite3dSmoke;
private var smokeGoneTr:Boolean;
private var physics:Away3D4Physics;
private var blaMaterial:TextureMaterial;
private var carBody:JCar;
private var steerFL:*;
private var steerFR:*;
private var wheelFL:*;
private var wheelFR:*;
private var wheelBL:*;
private var wheelBR:*;
private var carContainer:ObjectContainer3D;
private var smokePosContainer:ObjectContainer3D;
private var lightPicker:StaticLightPicker;
private var shadowMapMethod:DitheredShadowMapMethod;
public function Away3DJiglibSmokeTesterDoc()
{
view = new View3D();
view.camera.lens.far = 50000;
view.camera.lens.near = 1;
//view.camera.moveTo( 0, 1000, 0);//camA
view.camera.moveTo( 1000*camScale, 500*camScale, 300*camScale);//camB
//view.camera.moveTo( 300, 500, 1000);//camC
view.camera.lookAt(new Vector3D(0, 0, 0))
sprite = new Sprite();
sprite.addChild(view);
sprite.addChild(new AwayStats(view));
addChild(sprite);
var perlinBitmap:BitmapData = getPerlinBmd();
container = new ObjectContainer3D();
view.scene.addChild(container);
var directonalLight:DirectionalLight = new DirectionalLight()//200, -500, 0);
directonalLight.color = 0xFFFF80;
directonalLight.ambientColor = 0x80FFFF;
//directonalLight.castsShadows = true;
directonalLight.ambient = 0.5;
directonalLight.diffuse = 1;
directonalLight.specular = 1;
//directonalLight.
//directonalLight.lookAt(new Vector3D());
container.addChild(directonalLight);
lightPicker = new StaticLightPicker([directonalLight]);
shadowMapMethod = new DitheredShadowMapMethod(directonalLight);
trace('hardShadowMapMethod.epsilon ' + shadowMapMethod.epsilon);//0.02
shadowMapMethod.epsilon = 0.003;
shadowMapMethod.alpha = 1;
container.scaleX = container.scaleY = container.scaleZ = containerScale;
//JConfig JConfig
//JConfig JConfig
//JConfig JConfig
var bgMaterial:TextureMaterial = new TextureMaterial(new BitmapTexture(perlinBitmap), false, true);
bgMaterial.shadowMethod = shadowMapMethod;
bgMaterial.lightPicker = lightPicker;
bgMaterial.gloss = 100;
blaMaterial = mekeBlaMaterial();
blaMaterial.lightPicker = lightPicker;
//JConfig.solverType="FAST";
physics = new Away3D4Physics(view, 6);
var rgBody:RigidBody = physics.createGround(bgMaterial,1000,1000,1,1,true);
createBox();
createCar();
var bgMesh:Mesh = physics.getMesh(rgBody);
bgMesh.scaleX = bgMesh.scaleZ = 2;
container.addChild(bgMesh);
sprite.addChild(hrefTxt = new TextField());
with (hrefTxt) { border = background = true; selectable = false;
x = 150; scaleX = scaleY = 1.4; backgroundColor = 0xFFFFFF; }
hrefTxt.autoSize = TextFieldAutoSize.LEFT;
var htmStr:String = '';
htmStr = addStrHref('camA') + addStrHref('camB')
+ addStrHref('camC');
//+addStrHref('delete') +addStrHref('add');
hrefTxt.htmlText = htmStr;
hrefTxt.addEventListener("link", txtNavHandler);
bgMesh.mouseEnabled = true;
bgMesh.addEventListener( MouseEvent3D.MOUSE_MOVE, onBgMeshMouseMove);
whiteSprite3dSmoke =
new Sprite3dSmoke(container,0xFF00FF, 0.7, 300, 20, 3, 2);
addEventListener(Event.ENTER_FRAME, enterFrameHandler);
stage.addEventListener(KeyboardEvent.KEY_DOWN, keyDownHandler);
stage.addEventListener(KeyboardEvent.KEY_UP, keyUpHandler);
}
private function createCar() : void {
carContainer = new ObjectContainer3D();
container.addChild(carContainer);
carContainer.addChild(makeCube(40/2, 20/2, 90/2));
carContainer.addChild(smokePosContainer = new ObjectContainer3D());
smokePosContainer.position = new Vector3D(-0, -10, -50);
var oWheelFR:ObjectContainer3D = new ObjectContainer3D();
var oWheelFL:ObjectContainer3D = new ObjectContainer3D();
var oWheelFR_PIVOT:ObjectContainer3D = new ObjectContainer3D();
var oWheelFL_PIVOT:ObjectContainer3D = new ObjectContainer3D();
var oWheelBR:ObjectContainer3D = new ObjectContainer3D();
var oWheelBL:ObjectContainer3D = new ObjectContainer3D();
var oWheelBR_PIVOT:ObjectContainer3D = new ObjectContainer3D();
var oWheelBL_PIVOT:ObjectContainer3D = new ObjectContainer3D();
carContainer.addChild(oWheelFR);
oWheelFR.addChild(oWheelFR_PIVOT)
oWheelFR_PIVOT.addChild(setupWheel());
carContainer.addChild(oWheelFL);
oWheelFL.addChild(oWheelFL_PIVOT);
oWheelFL_PIVOT.addChild(setupWheel());
carContainer.addChild(oWheelBR);
oWheelBR.addChild(oWheelBR_PIVOT)
var w:Mesh;
oWheelBR_PIVOT.addChild(w = setupWheel());
w.rotationX = 90;
oWheelBR_PIVOT.rotationY = 90;
oWheelBR.rotationY = 90;
carContainer.addChild(oWheelBL);
oWheelBL.addChild(oWheelBL_PIVOT);
oWheelBL_PIVOT.addChild(w = setupWheel());
w.rotationX = 90;
oWheelBL_PIVOT.rotationY = 90;
oWheelBL.rotationY = 90;
oWheelFR.name = "WheelFR";
oWheelFR.position = new Vector3D(20, -10, 25);
oWheelFR_PIVOT.name = "WheelFR_PIVOT";
oWheelFL.name = "WheelFL";
oWheelFL.position = new Vector3D(-20, -10, 25);
oWheelFL_PIVOT.name = "WheelFL_PIVOT";
oWheelBR.name = "WheelBR";
oWheelBR.position = new Vector3D(20, -10, -25);
oWheelBR_PIVOT.name = "WheelBR_PIVOT";
oWheelBL.name = "WheelBL";
oWheelBL.position = new Vector3D(-20, -10, -25);
oWheelBL_PIVOT.name = "WheelBL_PIVOT";
carBody = new JCar(new Away3D4Object(carContainer));
carBody.setCar(40, 5, 500);
carBody.chassis.moveTo(new Vector3D(200, 0, 0));
carBody.chassis.rotationY = 90;
carBody.chassis.mass = 9;
carBody.chassis.sideLengths = new Vector3D(40, 20, 90);
physics.addBody(carBody.chassis);
carBody.setupWheel("WheelFL", new Vector3D(-20, -10, 25), 1.2, 1.5, 3, 8, 0.4, 0.5, 2);
carBody.setupWheel("WheelFR", new Vector3D(20, -10, 25), 1.2, 1.5, 3, 8, 0.4, 0.5, 2);
carBody.setupWheel("WheelBL", new Vector3D(-20, -10, -25), 1.2, 1.5, 3, 8, 0.4, 0.5, 2);
carBody.setupWheel("WheelBR", new Vector3D(20, -10, -25), 1.2, 1.5, 3, 8, 0.4, 0.5, 2);
steerFL = oGetChildByName(carContainer,"WheelFL");
steerFR = oGetChildByName(carContainer,"WheelFR");
wheelFL = oGetChildByName(carContainer,"WheelFL_PIVOT");
wheelFR = oGetChildByName(carContainer,"WheelFR_PIVOT");
wheelBL = oGetChildByName(carContainer,"WheelBL");
wheelBR = oGetChildByName(carContainer,"WheelBR");
}
private function keyDownHandler(event:KeyboardEvent) : void
{
switch(event.keyCode)
{
case Keyboard.UP:
case 87:
{
carBody.setAccelerate(1);
break;
}
case Keyboard.DOWN:
case 83:
{
carBody.setAccelerate(-1);
break;
}
case Keyboard.LEFT:
case 65:
{
carBody.setSteer(["WheelFL", "WheelFR"], -1);
break;
}
case Keyboard.RIGHT:
case 68:
{
carBody.setSteer(["WheelFL", "WheelFR"], 1);
break;
}
case Keyboard.SPACE:
{
carBody.setHBrake(1);
break;
}
default:
{
break;
}
}
}
private function keyUpHandler(event:KeyboardEvent) : void
{
trace(event.keyCode);
switch(event.keyCode)
{
case Keyboard.UP:
case 87:
{
carBody.setAccelerate(0);
break;
}
case Keyboard.DOWN:
case 83:
{
carBody.setAccelerate(0);
break;
}
case Keyboard.LEFT:
case 65:
{
carBody.setSteer(["WheelFL", "WheelFR"], 0);
break;
}
case Keyboard.RIGHT:
case 68:
{
carBody.setSteer(["WheelFL", "WheelFR"], 0);
break;
}
case Keyboard.SPACE:
{
carBody.setHBrake(0);
}
default:
{
break;
}
}
return;
}
private function updateWheelSkin() : void
{
steerFL.rotationY = carBody.wheels["WheelFL"].getSteerAngle();
steerFR.rotationY = carBody.wheels["WheelFR"].getSteerAngle();
wheelFL.pitch(carBody.wheels["WheelFL"].getRollAngle());
wheelFR.pitch(carBody.wheels["WheelFR"].getRollAngle());
wheelBL.roll(carBody.wheels["WheelBL"].getRollAngle());
wheelBR.roll(carBody.wheels["WheelBR"].getRollAngle());
steerFL.y = carBody.wheels["WheelFL"].getActualPos().y;
steerFR.y = carBody.wheels["WheelFR"].getActualPos().y;
wheelBL.y = carBody.wheels["WheelBL"].getActualPos().y;
wheelBR.y = carBody.wheels["WheelBR"].getActualPos().y;
}
private function oGetChildByName(o:ObjectContainer3D, name:String):*{
var o1:*;
var o2:*;
for (var i:int = 0; i < o.numChildren; i++) {
o1 = o.getChildAt(i);
if (o1.name == name) return o1;
for (var j:int = 0; j < o1.numChildren; j++) {
o2 = o1.getChildAt(j);
if (o2.name == name) return o2;
}
}
return null;
}
private function createBox() : void
{
var material:TextureMaterial = blaMaterial;// new TextureMaterial(new BitmapTexture(new BitmapData(2, 64, false, 0xFF8040)), false, true);
var i:int;
while (i < 4)
{
var rgB:RigidBody = physics.createCube(material, 100, 100, 100, 1, 1, 1);
reCube(rgB, 50, 50, 50);
rgB.y = 102 * (i+1);
i++;
}
}
public function reCube(rgB:RigidBody,sx:Number,sy:Number,sz:Number):void {
var mesh:Mesh = physics.getMesh(rgB);
mesh.parent.removeChild(mesh);
var mmesh:Mesh = makeCube(sx,sy,sz);
mesh.geometry = mmesh.geometry;
container.addChild(mesh);
}
public function onBgMeshMouseMove(e:MouseEvent3D):void {
sceneMousePosition = e.scenePosition.clone();
}
private function txtNavHandler(e:TextEvent):void {
if (e.text == 'camA') view.camera.moveTo( 0, 5000*camScale, 0);
if (e.text == 'camB') view.camera.moveTo( 1000*camScale, 500*camScale, 300*camScale);
if (e.text == 'camC') view.camera.moveTo( 300 * camScale, 500 * camScale, 1000 * camScale);
if (e.text == 'delete') smokeGoneTr = true;
if (e.text == 'add') smokeGoneTr = false;
view.camera.lookAt(new Vector3D(0, 0, 0));
}
private function addStrHref(str:String, delimStr:String = ' | '):String {
return "<a href='event:" + str + "'>" + str + "<u></u>"+delimStr;
}
private function enterFrameHandler(e:Event):void {
var carContainerPosition:Vector3D = carContainer.position;
physics.engine.integrate(0.12);
updateWheelSkin();
var pos:Vector3D = smokePosContainer.scenePosition.clone();
pos.scaleBy(1/containerScale);
//pos.y += 50;
if (smokeGoneTr == false) whiteSprite3dSmoke.update(pos,container);
if (smokeGoneTr == true) whiteSprite3dSmoke.updateAndDelete(pos);
if (carBody.chassis.getVelocity(carContainerPosition).length > 50) smokeGoneTr = false;
else smokeGoneTr = true;
view.render();
}
public function getPerlinBmd():BitmapData {
var s:Number = 512;
var bitmapData:BitmapData = new BitmapData(s, s, true);
var numOctaves:Number = 1;
bitmapData.perlinNoise(25, 52, 1, 1314, false, false, 10, false)
var sp:Sprite = new Sprite();
sp.graphics.beginFill(0xFFFFFF);
sp.graphics.drawRect(0, 0, s, s);
sp.addChild(new Bitmap(bitmapData));
var resBitmap:BitmapData = new BitmapData(s, s, true);
resBitmap.draw(sp);
return resBitmap;
}
public function makeCube(sx:Number = 100, sy:Number = 100, sz:Number = 100):Mesh {
var geometry:Geometry = new Geometry();
var subGeometry:SubGeometry = new SubGeometry();
var meVertices:Array = [1.00000,1.00000,-1.00000,1.00000,-1.00000,-1.00000,-1.00000,-1.00000,-1.00000,-1.00000,1.00000,-1.00000,1.00000,1.00000,1.00000,1.00000,-1.00000,1.00000,-1.00000,-1.00000,1.00000,-1.00000,1.00000,1.00000];
var meIndex:Array = [0,1,2,0,2,3,4,7,6,4,6,5,0,4,5,0,5,1,1,5,6,1,6,2,2,6,7,2,7,3,4,0,3,4,3,7];
var meUv:Array = [1, 0, 2 / 3, 0, 2 / 3, 0.5, 1, 0, 2 / 3, 0.5, 1, 0.5, 1 / 3, 0, 0, 0, 0, 0.5, 1 / 3,
0, 0, 0.5, 1 / 3, 0.5, 1 / 3, 0.5, 0, 0.5, 0, 1, 1 / 3, 0.5, 0, 1, 1 / 3, 1, 2 / 3, 0, 1 / 3, 0, 1 / 3, 0.5, 2 / 3,
0, 1 / 3, 0.5, 2 / 3, 0.5, 2 / 3, 0.5, 1 / 3, 0.5, 1 / 3, 1, 2 / 3, 0.5, 1 / 3, 1, 2 / 3, 1, 1, 0.5, 2 / 3, 0.5, 2 / 3, 1, 1, 0.5,
2/3,1,1,1];
var mv:Array = [];
var mUv:Array = [];
var i:int;
for (i = 0; i < meIndex.length; i++) {
mUv.push(meUv[meIndex[i] * 2 + 0], meUv[meIndex[i] * 2 + 1]);
mv.push(meVertices[meIndex[i] * 3 + 0], meVertices[meIndex[i] * 3 + 1], meVertices[meIndex[i] * 3 + 2]);
}
meVertices = mv;
for (i = 0; i < meVertices.length; i+=3) {
meVertices[i + 0] *= sx;
meVertices[i + 1] *= sy;
meVertices[i + 2] *= sz;
}
var indexData:Vector.<uint> = new Vector.<uint>();
for (i = 0; i < 36; i++) indexData.push(i);
subGeometry.updateVertexData(Vector.<Number>(mv));
subGeometry.updateUVData(Vector.<Number>(meUv));
subGeometry.updateIndexData(indexData);
subGeometry.autoDeriveVertexNormals = true;
subGeometry.autoDeriveVertexTangents = true;
geometry.subGeometries.push(subGeometry);
var cM:Mesh = new Mesh(geometry, blaMaterial);
return cM;
}
private function setupWheel() : Mesh
{
return makeCube(5,10,10);
}
public function mekeBlaMaterial():TextureMaterial {
var s:Sprite = new Sprite();
var sh:Shape = new Shape();
var b:Bitmap;
var e:Number = 128;
s.addChild(makeABitmap('A'));
s.addChild(b = makeABitmap('B'));
b.x = e;
s.addChild(b = makeABitmap('C'));
b.x = e * 2;
s.addChild(b = makeABitmap('D'));
b.y = e;
s.addChild(b = makeABitmap('E'));
b.x = e; b.y = e;
s.addChild(b = makeABitmap('F'));
b.x = e * 2; b.y = e;
s.addChild(sh);
sh.graphics.lineStyle(24, 0xFF8000);
for (var i:int; i < 6; i++) {
sh.graphics.drawRect(i % 3 * e, int(i / 3) * e, e, e);
}
var bmd:BitmapData = new BitmapData(256, 256);
var m:Matrix = new Matrix();
m.scale(1 / 1.5, 1);
bmd.draw(s, m);
//addChild(new Bitmap(bmd));////show my cube textures
return new TextureMaterial(new BitmapTexture(bmd), false, true);
}
public function makeABitmap(str:String = 'A'):Bitmap {
var txt:TextField = new TextField();
txt.htmlText = '<FONT FACE="courier" SIZE="12" COLOR="#000000" LETTERSPACING="0" KERNING="0"><b>'+str+'</b></FONT></P>';
var tbmd:BitmapData = new BitmapData(128, 128);
var m:Matrix = new Matrix();
m.ty = -4;
m.tx = -2;
m.scale(13, 13);
tbmd.draw(txt,m);
return new Bitmap(tbmd);
}
}
}
It's previous version of sprite3dSmoke.
You can download a zip with away3d 4.1.1 shadow jiglib car and smoke.
How it demo will be on Alternativa3d.
Update Contact :
No Wa/Telepon (puat) : 085267792168
No Wa/Telepon (fajar) : 085369237896
Email : Fajarudinsidik@gmail.com
No Wa/Telepon (puat) : 085267792168
No Wa/Telepon (fajar) : 085369237896
Email: Fajarudinsidik@gmail.com
atau Kirimkan Private messanger melalui email dengan klik tombol order dibawah ini :