纳金网
标题:
away3D 碰撞问题
[打印本页]
作者:
yeu1233
时间:
2012-9-12 15:31
标题:
away3D 碰撞问题
这个是限制相机的移动范围 。
下图为相机的移动的限制图。红色部分为可移动范围。
属性:
[Embed(source="dd.jpg")]
private var CollisionBitmap:Class;
private var collisionBitmap:BitmapData;
private var sampleBitmap:BitmapData;
private var sampleRect:Rectangle = new Rectangle();
private var samplePoint
oint = new Point();
private var collisionRect:Rectangle;
private var cameraX:Number;
private var cameraY:Number;
private var collisionShape:Shape = new Shape();
private var collisionVector
oint = new Point();
private var collisionMatrix:Matrix = new Matrix();
private var collisionDot:Number;
private var collisionDistance:Number = 30;
读取图片
private function initCollisionBitmap():void
{
collisionBitmap = Cast.bitmap(CollisionBitmap);
sampleBitmap = new BitmapData(collisionDistance*2, collisionDistance*2, false, 0);
sampleRect = new Rectangle(0, 0, collisionDistance*2, collisionDistance*2);
}
检测方法
private 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();
}
}
欢迎光临 纳金网 (http://rs.narkii.com/club/)
Powered by Discuz! X2.5