Alternativa3D 8.32.0 jiglib car physics racing with textured and shadow cube.
Video alternativa3d and away3d test. Well you know away3d and jiglib and I like to know that is different if last one can be improve with Alternativa3D 8.32.0 Alternativa3D 8.32.0. It's like a "Away3d vs Alternativa3D", then who winer? Well I don't know, they both are awesome. I have already taken current Jiglibflash update for Away3D 4.1 alpha dev branch (stage3d) and hello word alternativa3d example.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 alternativa.engine3d.controllers.*;import alternativa.engine3d.core.*;
import alternativa.engine3d.lights.*;import alternativa.engine3d.materials.*;
import alternativa.engine3d.primitives.*;import alternativa.engine3d.resources.*;
import alternativa.engine3d.shadows.*;import alternativa.engine3d.loaders.*;
import alternativa.engine3d.objects.*;import alternativa.engine3d.core.*;
import alternativa.protocol.codec.primitive.*;
import flash.display.*; import flash.events.*; import flash.system.*;
import flash.ui.*; import flash.utils.*; import flash.sampler.*;
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.*;
/**
* Alternativa3D 8.32.0 13.05.2013 0:23 "Hello world + shadow + box + jiglib 3d physics!"
*/
public class HelloAlternativa3D extends Sprite {
private var rootContainer:Object3D = new Object3D();
private var camera:Camera3D;
private var stage3D:Stage3D;
private var box:Mesh;
private var material:TextureMaterial;
private var spriteSmoke:Sprite3dSmoke;
private var physics:AbstractPhysics;
private var blaMaterial:VertexLightTextureMaterial;
private var shadow:DirectionalLightShadow;
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:Object3D;
private var smokePosContainer:Object3D;
private var hrefTxt:TextField;
public function HelloAlternativa3D() {
stage.align = StageAlign.TOP_LEFT;
stage.scaleMode = StageScaleMode.NO_SCALE;
stage3D = stage.stage3Ds[0];
stage3D.addEventListener(Event.CONTEXT3D_CREATE, onContextCreate);
stage3D.requestContext3D();
}
private function onContextCreate(e:Event):void {
var bitmapCubeResource:BitmapTextureResource
= new BitmapTextureResource(makeBlaBmd());
var planeResource:BitmapTextureResource
= new BitmapTextureResource(getPerlinBmd());
var smokeBitmapTextureResource:BitmapTextureResource =
new BitmapTextureResource(Sprite3dSmoke.makeSmokePuffBmd(0xFF80FF));
var grass_diffuse:BitmapTextureResource = new BitmapTextureResource(new BitmapData(1, 1, false, 0xFF0000));
var grass_normal:BitmapTextureResource = new BitmapTextureResource(new BitmapData(1, 1, false, 0xFFFFFF));
var box_normal:BitmapTextureResource = new BitmapTextureResource(new BitmapData(1, 1, false, 0xFFFFFF));
bitmapCubeResource.upload(stage3D.context3D);
smokeBitmapTextureResource.upload(stage3D.context3D);
grass_diffuse.upload(stage3D.context3D);
grass_normal.upload(stage3D.context3D);
box_normal.upload(stage3D.context3D);
// Camera and view
camera = new Camera3D(0.1, 10000);
camera.view = new View(stage.stageWidth, stage.stageHeight, false, 0, 0, 4);
addChild(camera.view);
addChild(camera.diagram);
// Initial position
camera.setPosition(350, 700, 0);
camera.lookAt(0, 0, 0);
camera.rotationY = Math.PI / 2;
rootContainer.addChild(camera);
// Light sources
var ambientLight:AmbientLight = new AmbientLight(0x333333);
ambientLight.intensity = 3;
ambientLight.z = 200;
ambientLight.y = -200;
ambientLight.x = 200;
rootContainer.addChild(ambientLight);
var directionalLight:DirectionalLight = new DirectionalLight(0xFFFF99);
directionalLight.z = 20000;
directionalLight.y = 20000;
directionalLight.x = 20000;
directionalLight.intensity = 1;
//directionalLight.lookAt(2000, 0, 0);
directionalLight.lookAt(0, 0, 0);
rootContainer.addChild(directionalLight);
blaMaterial = new VertexLightTextureMaterial(bitmapCubeResource, box_normal, 1);
//var material:TextureMaterial = new TextureMaterial(grass_normal, box_normal, 1);
//var rgBody:RigidBody = physics.addBody((bgMaterial,1000,1000,1,1,true);
var plObj:Object3D = new Object3D();
var plane:Plane = new Plane(1000, 1000);
plane.rotationX = Math.PI / 2;
var planeMaterial:StandardMaterial =
new StandardMaterial(planeResource, grass_normal);
plane.setMaterialToAllSurfaces(planeMaterial);
plObj.addChild(plane);
rootContainer.addChild(plObj);
var smokeMaterial:StandardMaterial =
new StandardMaterial(smokeBitmapTextureResource, box_normal);
smokeMaterial.alpha = 0.7;
smokeMaterial.alphaThreshold = 1;
smokeMaterial.lightMap = grass_diffuse;
spriteSmoke = new Sprite3dSmoke(rootContainer, 30, 20, 3, 2, smokeMaterial);
// Shadow
shadow = new DirectionalLightShadow(1000, 1000, -500, 500, 512, 2);
shadow.biasMultiplier = 0.97;
//shadow.addCaster(plane);
//shadow.addCaster(box);
directionalLight.shadow = shadow;
for each (var resource:Resource in rootContainer.getResources(true)) {
resource.upload(stage3D.context3D);
}
physics = new AbstractPhysics(6);
var jGround:JPlane =
new JPlane(new Alternativa3DSkinObject(plObj), new Vector3D(0, 1, 0));
jGround.y = 0;
jGround.movable = false;
physics.addBody(jGround);
createBox();
createCar();
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');
hrefTxt.htmlText = htmStr;
hrefTxt.addEventListener("link", txtNavHandler);
// Listeners
stage.addEventListener(Event.ENTER_FRAME, onEnterFrame);
stage.addEventListener(KeyboardEvent.KEY_DOWN, keyDownHandler);
stage.addEventListener(KeyboardEvent.KEY_UP, keyUpHandler);
}
private function onEnterFrame(e:Event):void {
var carContainerPosition:Vector3D =
new Vector3D(carContainer.x, carContainer.y, carContainer.z);
physics.engine.integrate(0.12);
updateWheelSkin();
var pos:Vector3D =
new Vector3D(smokePosContainer.x, smokePosContainer.y, smokePosContainer.z)
pos = carContainer.matrix.transformVector(pos);
if (carBody.chassis.getVelocity(carContainerPosition).length > 50)
spriteSmoke.update(pos,rootContainer);
else spriteSmoke.updateAndDelete(pos);
// Width and height of view
//camera.view.width = stage.stageWidth;
//camera.view.height = stage.stageHeight;
// Render
camera.render(stage3D);
}
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 createCar() : void {
carContainer = new Object3D();
rootContainer.addChild(carContainer);
carContainer.addChild(makeCube(40, 20, 90));
carContainer.addChild(smokePosContainer = new Object3D());
position(smokePosContainer, new Vector3D( -0, -10, -50));
var oWheelFR:Object3D = new Object3D();
var oWheelFL:Object3D = new Object3D();
var oWheelFR_PIVOT:Object3D = new Object3D();
var oWheelFL_PIVOT:Object3D = new Object3D();
var oWheelBR:Object3D = new Object3D();
var oWheelBL:Object3D = new Object3D();
var oWheelBR_PIVOT:Object3D = new Object3D();
var oWheelBL_PIVOT:Object3D = new Object3D();
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());
carContainer.addChild(oWheelBL);
oWheelBL.addChild(oWheelBL_PIVOT);
oWheelBL_PIVOT.addChild(w = setupWheel());
oWheelFR.name = "WheelFR";
position(oWheelFR, new Vector3D(20, -10, 25));
oWheelFR_PIVOT.name = "WheelFR_PIVOT";
oWheelFL.name = "WheelFL";
position(oWheelFL, new Vector3D(-20, -10, 25));
oWheelFL_PIVOT.name = "WheelFL_PIVOT";
oWheelBR.name = "WheelBR";
position(oWheelBR, new Vector3D(20, -10, -25));
oWheelBR_PIVOT.name = "WheelBR_PIVOT";
oWheelBL.name = "WheelBL";
position(oWheelBL, new Vector3D(-20, -10, -25));
oWheelBL_PIVOT.name = "WheelBL_PIVOT";
carBody = new JCar(new Alternativa3DSkinObject(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 position(o:*, v:Vector3D):void {
o.x = v.x;
o.y = v.y;
o.z = v.z;
}
private function updateWheelSkin() : void
{
/*
carContainer.matrix =
JMatrix3D.getAppendMatrix3D(carBody.chassis.currentState.orientation,
JMatrix3D.getTranslationMatrix(carBody.chassis.currentState.position.x,
carBody.chassis.currentState.position.y, carBody.chassis.currentState.position.z));
*/
steerFL.rotationY = carBody.wheels["WheelFL"].getSteerAngle()*Math.PI/180;
steerFR.rotationY = carBody.wheels["WheelFR"].getSteerAngle()*Math.PI/180;
//wheelFL.pitch(carBody.wheels["WheelFL"].getRollAngle());
wheelFL.rotationX += carBody.wheels["WheelFL"].getRollAngle()*Math.PI/180;
//wheelFR.pitch(carBody.wheels["WheelFR"].getRollAngle());
wheelFR.rotationX += carBody.wheels["WheelFR"].getRollAngle()*Math.PI/180;
//wheelBL.roll(carBody.wheels["WheelBL"].getRollAngle());
wheelBL.rotationX += carBody.wheels["WheelBL"].getRollAngle()*Math.PI/180;
//wheelBR.roll(carBody.wheels["WheelBR"].getRollAngle());
wheelBR.rotationX += carBody.wheels["WheelBR"].getRollAngle()*Math.PI/180;
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:Object3D, name:String):*{
var o1:*;
var o2:*;
for (var i:int = 0; i < o.numChildren; i++) {
o1 = o.getChildAt(i);
trace(o1.name);
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 setupWheel() : Mesh
{
return makeCube(10,20,20);
}
private function createBox() : void
{
var i:int;
while (i < 4)
{
var box:Mesh = makeCube(100, 100, 100);
box.z = 100;
rootContainer.addChild(box);
var jBox:JBox = new JBox(new Alternativa3DSkinObject(box), 100, 100, 100);
physics.addBody(jBox);
jBox.y = 102 * (i+1);
i++;
}
}
private function txtNavHandler(e:TextEvent):void {
if (e.text == 'camA') {
camera.setPosition(0, 2000, 0);
camera.lookAt(0, 0, 0);
camera.rotationY = Math.PI / 2;
}
if (e.text == 'camB') {
camera.setPosition(350, 700, 0);
camera.lookAt(0, 0, 0);
camera.rotationY = Math.PI / 2;
}
if (e.text == 'camC') {
camera.setPosition(-568, 128, 75);
camera.lookAt(0, 0, 0);
camera.rotationY = -Math.PI / 2;
}
}
private function addStrHref(str:String, delimStr:String = ' | '):String {
return "<a href='event:" + str + "'>" + str + "<u></u>"+delimStr;
}
private function makeCube(sx:Number = 100, sy:Number = 100, sz:Number = 100):Mesh {
var mesh:Mesh = new Mesh();
var attributes:Array = [
VertexAttributes.POSITION,
VertexAttributes.POSITION,
VertexAttributes.POSITION,
VertexAttributes.TEXCOORDS[0],
VertexAttributes.TEXCOORDS[0],
VertexAttributes.NORMAL,
VertexAttributes.NORMAL,
VertexAttributes.NORMAL,
VertexAttributes.TANGENT4,
VertexAttributes.TANGENT4,
VertexAttributes.TANGENT4,
VertexAttributes.TANGENT4
];
var meVertices:Array = [1,1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,1,1,1,1,-1,1,-1,-1,1,-1,1,1];
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]);
mUv.push(meUv[i * 2 + 0], meUv[i * 2 + 1]);
mv.push(meVertices[meIndex[i] * 3 + 0], meVertices[meIndex[i] * 3 + 1], meVertices[meIndex[i] * 3 + 2]);
}
for (i = 0; i < mv.length; i+=3) {
mv[i + 0] *= sx/2;
mv[i + 1] *= sy/2;
mv[i + 2] *= sz/2;
}
var indexData:Vector.<uint> = new Vector.<uint>();
for (i = 0; i < 36; i++) indexData.push(i);
var vertices:Vector.<Number> = Vector.<Number>(mv);
var indexes:Vector.<uint> = indexData;
var uvs:Vector.<Number> = Vector.<Number>(mUv);
//trace(vertices.length + " " + segments * 3)
mesh.geometry = new Geometry();
mesh.geometry.numVertices = vertices.length/3;
mesh.geometry.indices = indexes;
mesh.geometry.addVertexStream(attributes);
mesh.geometry.setAttributeValues(VertexAttributes.POSITION, vertices);
mesh.geometry.setAttributeValues(VertexAttributes.TEXCOORDS[0], uvs);
//mesh.geometry.setAttributeValues(VertexAttributes.TANGENT4, tangent);
//mesh.geometry.setAttributeValues(VertexAttributes.NORMAL, normals);
mesh.geometry.calculateTangents(0);
mesh.geometry.calculateNormals();
mesh.addSurface(material, 0, indexes.length / 3);
mesh.geometry.upload(stage3D.context3D);
mesh.calculateBoundBox();
//mesh.setMaterialToAllSurfaces(material);
//stage3D.context3D.setCulling(Context3DTriangleFace.FRONT_AND_BACK);
//cameraContainer.rotationZ = -Math.PI/2;
shadow.addCaster(mesh);
mesh.setMaterialToAllSurfaces(blaMaterial);
return mesh;
}
public function makeBlaBmd():BitmapData {
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 bmd;
}
public function makeABitmap(str:String = 'A'):Bitmap {
var txt:TextField = new TextField();
txt.htmlText =
'<FONT FACE="courier" SIZE="12" COLOR="0" 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);
}
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;
}
}
}
It's zip alternativa3d and jiglib flash physics.
I made new tutorial How to made export with blender3d to alternativa3d using python.
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 :