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?

Reply via email to