Hi guys, I really need your help on this one. I just can't get my
collisionMap working.
Please take a look at my code or just point me to the right direction.
CODE
import away3d.cameras.*;
import away3d.cameras.lenses.*;
import away3d.containers.*;
import away3d.core.base.*;
import away3d.core.clip.*;
import away3d.core.draw.*;
import away3d.core.math.*;
import away3d.core.render.*;
import away3d.core.utils.*;
import away3d.events.*;
import away3d.loaders.*;
import away3d.loaders.data.*;
import away3d.materials.*;
import away3d.primitives.*;
var toRADIANS:Number = Math.PI / 180;
//navigation variables
var move:Boolean = false;
var lastPanAngle:Number;
var lastTiltAngle:Number;
var lastMouseX:Number;
var lastMouseY:Number;
var upFlag:Boolean = false;
var downFlag:Boolean = false;
var leftFlag:Boolean = false;
var rightFlag:Boolean = false;
var cameraForwardSpeed:Number = 0;
var cameraForwardAcc:Number = 2;
var cameraForwardDrag:Number = 0.3;
var cameraRightSpeed:Number = 0;
var cameraRightAcc:Number = 2;
var cameraRightDrag:Number = 0.3;
var forwardVector:Number3D = new Number3D();
var rightVector:Number3D = new Number3D();
var tiltangle:Number = 0;
var panangle:Number = -100;
var target:Number3D = new Number3D();
var targettiltangle:Number = 0;
var targetpanangle:Number = 0;
//engine variables
var scene:Scene3D;
var camera:Camera3D;
var view:View3D;
var clipping:Clipping;
//collision varaibles
var collisionBitmap:BitmapData;
var sampleBitmap:BitmapData;
var sampleRect:Rectangle = new Rectangle();
var samplePoint:Point = new Point();
var collisionRect:Rectangle;
var cameraX:Number;
var cameraY:Number;
var collisionShape:Shape = new Shape();
var collisionVector:Point = new Point();
var collisionMatrix:Matrix = new Matrix();
var collisionDot:Number;
var collisionDistance:Number = 30;
Debug.active = true;
scene = new Scene3D();
clipping = new FrustumClipping();
clipping.minZ = 10;
//camera = new Camera3D({zoom:6, focus:100, x:176, z:54, lens:new
PerspectiveLens()});
camera = new Camera3D();
camera.zoom = 2;
camera.focus = 100;
camera.x = 0;
camera.y = 10;
camera.z = 0;
camera.rotationX = 0;
camera.rotationY = 0;
//camera.lookAt( new Number3D(0,0,0) );
camera.lens = new PerspectiveLens();
//view = new View3D({scene:scene, camera:camera, clipping:clipping});
view = new View3D();
view.x = 250;
view.y = 200;
view.scene = scene;
view.camera = camera;
view.clipping = clipping;
view.renderer = Renderer.CORRECT_Z_ORDER;
addChild(view);
init();
/**
* Global initialise function
*/
function init():void
{
initCollisionBitmap();
}
//addEventListener(Event.ENTER_FRAME, onEnterFrame);
//stage.addEventListener(MouseEvent.MOUSE_DOWN, MouseDown);
//stage.addEventListener(MouseEvent.MOUSE_UP, MouseUp);
var obj1 = Obj.load("piso.obj", { material:"chao.jpg", scaling:1, x:0,
y:0, z:0 } );
var obj2 = Obj.load("mesa.obj", { material:"mesa.jpg", scaling:1, x:0,
y:0, z:0 } );
var obj3 = Obj.load("paredes.obj", { material:"paredes.jpg", scaling:
1, x:0, y:0, z:0 } );
//var obj4 = Obj.load("cadeira.obj", { material:"cadeira.jpg", scaling:
100, x:0, y:0, z:0 } );
//obj4.rotationX = -180;
view.scene.addChild(obj1);
view.scene.addChild(obj2);
view.scene.addChild(obj3);
//view.scene.addChild(obj4);
//obj4.addOnSuccess(onLoaderSuccess);
//function onLoaderSuccess(event:Event):void {
// var obj5:Object3D = obj4.handle.clone();
// view.scene.addChild(obj5);
// obj5.position = new Number3D(100, 110, 0);
// obj5.rotationX = 0;
// obj5.rotationY = 180;
// obj5.rotationZ = -90;
//
// var obj6:Object3D = obj4.handle.clone();
// view.scene.addChild(obj6);
// obj6.position = new Number3D(-100, 110, 0);
// obj6.rotationX = 0;
// obj6.rotationY = 180;
// obj6.rotationZ = 90;
//
// var obj7:Object3D = obj4.handle.clone();
// view.scene.addChild(obj7);
// obj7.position = new Number3D(0, 220, 0);
// obj7.rotationX = 0;
// obj7.rotationY = 180;
// obj7.rotationZ = 0;
// }
addEventListener(Event.ENTER_FRAME, onEnterFrame);
stage.addEventListener(MouseEvent.MOUSE_DOWN, onMouseDown);
stage.addEventListener(MouseEvent.MOUSE_UP, onMouseUp);
stage.addEventListener(KeyboardEvent.KEY_DOWN, onKeyDown);
stage.addEventListener(KeyboardEvent.KEY_UP, onKeyUp);
function initCollisionBitmap():void
{
collisionBitmap = Cast.bitmap(CollisionBitmap);
sampleBitmap = new BitmapData(collisionDistance*2,
collisionDistance*2, false, 0);
//adding a debug view to the collision detection system
//var bitmap:Bitmap = new Bitmap(CollisionBitmap);
//addChild(CollisionBitmap);
sampleRect = new Rectangle(0, 0, collisionDistance*2,
collisionDistance*2);
}
function onEnterFrame(event:Event):void
{
//perform drag on teh speed of the camera
cameraForwardSpeed *= (1-cameraForwardDrag);
cameraRightSpeed *= (1-cameraRightDrag);
//halt camera if below a certain speed
if (cameraForwardSpeed < 0.01 && cameraForwardSpeed > -0.01)
cameraForwardSpeed = 0;
if (cameraRightSpeed < 0.01 && cameraRightSpeed > -0.01)
cameraRightSpeed = 0;
//check key flags
if (upFlag)
cameraForwardSpeed += cameraForwardAcc;
if (downFlag)
cameraForwardSpeed -= cameraForwardAcc;
if (rightFlag)
cameraRightSpeed += cameraRightAcc;
if (leftFlag)
cameraRightSpeed -= cameraRightAcc;
//calculate forward & back vector
forwardVector.rotate(Number3D.FORWARD, camera.transform);
forwardVector.y = 0;
forwardVector.normalize();
camera.x += forwardVector.x*cameraForwardSpeed;
camera.z += forwardVector.z*cameraForwardSpeed;
//calculate left & right vector
rightVector.rotate(Number3D.RIGHT, camera.transform);
rightVector.y = 0;
rightVector.normalize();
//update camrea position
camera.x += rightVector.x*cameraRightSpeed;
camera.z += rightVector.z*cameraRightSpeed;
//update rotation values
if (move) {
panangle = 0.3*(stage.mouseX - lastMouseX) + lastPanAngle;
tiltangle = -0.3*(stage.mouseY - lastMouseY) + lastTiltAngle;
if (tiltangle > 70)
tiltangle = 70;
if (tiltangle < -70)
tiltangle = -70;
}
//check collision
checkCollisionData();
//update camera rotation
target.x = 100 * Math.sin(panangle * toRADIANS) * Math.cos(tiltangle
* toRADIANS) + camera.x;
target.z = 100 * Math.cos(panangle * toRADIANS) * Math.cos(tiltangle
* toRADIANS) + camera.z;
target.y = 100 * Math.sin(tiltangle * toRADIANS) + camera.y;
camera.lookAt(target);
//render scene
view.render();
//check movement
if (!move && !cameraRightSpeed && !cameraForwardSpeed)
stage.quality = StageQuality.HIGH;
else
stage.quality = StageQuality.LOW;
}
function checkCollisionData():void
{
//get camera position on collision map
cameraX = 350 - camera.x*1.87;
cameraY = 510 + camera.z*1.87;
//determine position of sample data
sampleRect.x = int(cameraX - collisionDistance);
sampleRect.y = int(cameraY - collisionDistance);
//check for collision
var i:int = collisionDistance + 1;
do {
i--;
collisionRect = sampleBitmap.getColorBoundsRect(0xFFFFFF,
0x000000);
collisionShape.graphics.clear();
collisionShape.graphics.beginFill(0x660000);
collisionShape.graphics.drawCircle(collisionDistance,
collisionDistance, i);
collisionShape.graphics.endFill();
sampleBitmap.copyPixels(collisionBitmap, sampleRect,
samplePoint);
sampleBitmap.draw(collisionShape, null, null,
BlendMode.MULTIPLY);
} while (sampleBitmap.getColorBoundsRect(0xFFFFFF, 0x000000).width &&
i > 1)
//resolve collision
if (i < collisionDistance) {
//calculate collision normal
collisionVector.x = collisionRect.x + collisionRect.width/2 -
collisionDistance;
collisionVector.y = collisionRect.y + collisionRect.height/2 -
collisionDistance;
collisionVector.normalize(1);
//update camera position on collision map
cameraX -= collisionVector.x*(collisionDistance - i);
cameraY -= collisionVector.y*(collisionDistance - i);
//updata camrea position
camera.x = (350 - cameraX)/1.87;
camera.z = (cameraY - 510)/1.87;
//determin collision vector in camera-space
collisionMatrix.identity();
collisionMatrix.rotate(panangle * toRADIANS);
collisionVector.x = -collisionVector.x;
collisionVector = collisionMatrix.deltaTransformPoint
(collisionVector);
//update camera speed
collisionDot = cameraRightSpeed*collisionVector.x +
cameraForwardSpeed*collisionVector.y;
cameraRightSpeed -= collisionDot*collisionVector.x;
cameraForwardSpeed -= collisionDot*collisionVector.y;
//re-check collision data
checkCollisionData();
}
}
function onMouseDown(event:MouseEvent):void
{
lastPanAngle = panangle;
lastTiltAngle = tiltangle;
lastMouseX = stage.mouseX;
lastMouseY = stage.mouseY;
move = true;
stage.addEventListener(Event.MOUSE_LEAVE, onStageMouseLeave);
}
/**
* Mouse up handler for navigation
*/
function onMouseUp(event:MouseEvent):void
{
move = false;
stage.removeEventListener(Event.MOUSE_LEAVE, onStageMouseLeave);
}
/**
* Key down handler for key controls
*/
function onKeyDown(e:KeyboardEvent):void {
switch(e.keyCode)
{
case Keyboard.UP:
case "W".charCodeAt():
upFlag = true;
break;
case Keyboard.DOWN:
case "S".charCodeAt():
downFlag = true;
break;
case Keyboard.LEFT:
case "A".charCodeAt():
leftFlag = true;
break;
case Keyboard.RIGHT:
case "D".charCodeAt():
rightFlag = true;
break;
default:
}
}
/**
* Key up handler for key controls
*/
function onKeyUp(e:KeyboardEvent):void {
switch(e.keyCode)
{
case Keyboard.UP:
case "W".charCodeAt():
upFlag = false;
break;
case Keyboard.DOWN:
case "S".charCodeAt():
downFlag = false;
break;
case Keyboard.LEFT:
case "A".charCodeAt():
leftFlag = false;
break;
case Keyboard.RIGHT:
case "D".charCodeAt():
rightFlag = false;
break;
default:
}
}
/**
* Mouse stage leave listener for navigation
*/
function onStageMouseLeave(event:Event):void
{
move = false;
stage.removeEventListener(Event.MOUSE_LEAVE, onStageMouseLeave);
}
My collisionMap was generated off the floor texture (piso.jpg).
Anyone?