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;
}
}
}
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 :