代码改变世界

更多相当给力的公式集合,写as3或js特效可能会用到的,分享

2011-01-15 02:36  auntion  阅读(249)  评论(0编辑  收藏  举报

我自己整理了一下,没有找到更多了,大家将就用吧,哈哈

如果有更多的好公式,给我个传送门啊,谢谢

 

-----------------------------------------------------------
(基本物理)速度与加速度

角速度转换为x,y速度向量:
vx = speed * Math.cos(angle);
vy = speed * Math.sin(angle);

角加速度(作用于物体上的force)转换为x,y加速度:
ax = force * Math.cos(angle);
ay = force * Math.sin(angle);

将加速度加入速度向量:
vx += ax;
vy += ay;

将速度向量加入坐标:
sprite.x += vx;
sprite.y += vy;

-----------------------------------------------------------
缓动和弹性

简单缓动:

// 长形
var dx:Number = targetX - sprite.x;
var dy:Number = targetY - sprite.y;
vx = dx * easing;
vy = dy * easing;
sprite.x += vx;
sprite.y += vy;

// 中形
vx = (targetX - sprite.x) * easing;
vy = (targetY - sprite.y) * easing;
sprite.x += vx;
sprite.y += vy;

// 短形
sprite.x += (targetX - sprite.x) * easing;
sprite.y += (targetY - sprite.y) * easing;

简单弹性:
var ax:Number = (targetX - sprite.x) * spring;
var ay:Number = (targetY - sprite.y) * spring;
vx += ax;
vy += ay;
vx *= friction;
vy *= friction;
sprite.x += vx;
sprite.y += vy;

// 简化
vx += (targetX - sprite.x) * spring;
vy += (targetY - sprite.y) * spring;
sprite.x += (vx *= friction);
sprite.y += (vy *= friction);

偏移弹性运动:
var dx:Number = sprite.x - fixedX;
var dy:Number = sprite.y - fixedY;
var angle:Number = Math.atan2(dy,dx);
var targetX:Number = fixedX + Math.cos(angle) * springLength;
var targetY:Number = fixedY + Math.sin(angle) * springLength;

-----------------------------------------------------------
碰撞检测

距离碰撞检测:
//从spriteA 和 spriteB开始,如果使用一个空白影片,或影片没有半径(radius)属性
//可以用高度与宽度除以2
var dx:Number = spriteB.x - spriteA.x;
var dy:Number = spriteB.y - spriteA.y;
var dist:Number = Math.sqrt(dx*dx + dy*dy);
if (dist < spriteA.randius + spriteB.radius) {
//处理碰撞
}

多物体碰撞检测:
var numObjects:uint = 10;
for (var i :uint = 0; i < numObjects -1; i++) {
var objectA = object[i ];
for (var j :uint = 0; i < numObjects; j++) {
var objectB = object[j ];
// 在 objectA 与 objectB 之间进行碰撞检测
}
}

-----------------------------------------------------------
坐标旋转和角度回弹

坐标旋转:
x1 = Math.cos(angle) * x - Math.sin(angle) * y;
y1 = Math.sin(angle) * y + Math.cos(angle) * x;

反坐标旋转:
x1 = Math.cos(angle) * y + Math.sin(angle) * y;
y1 = Math.cos(angle) * y - Math.sin(angle) * y;

-----------------------------------------------------------
撞球物理

动量:p = m * v
动量守恒:(m0 * v0) + (m1 * v1) = (m0 * v0Final) + (m1 * v1Final)
动能:KE = 0.5 * m * v²
动能守恒:(0. 5 * m0 * v0²) + (0.5 * m1 * v1²) = (0.5 * m0 * v0Final²) + (0.5 * m1 * v1Final²)

动量守恒的数学表达式:
v0Final = ((m0 - m1) * v0 + 2 * m1 * v1 ) / (m0 + m1)
v1Final = ((m1 - m0) * v1 + 2 * m0 * v0 ) / (m0 + m1)

动量守恒的ActionScript表达式:
var vxTotal:Number = vx0 - vx1;
vx0 = ((ball0.mass - ball1.mass) * vx0 + 2 * ball1.mass * vx1 ) / (ball0.mass + ball1.mass);
vx1 = vxTotal + vx0;

-----------------------------------------------------------
粒子(Particles)引力和重力

引力的一般公式:
force = G * m1 * m2 / distance²

ActionScript 实现万有引力:
function gravitate ( partA:Ball, partB:Ball): void {
var dx:Number = partB.x - partA.x;
var dy:Number = partB.y - partA.y;
var distSQ:Number = dx * dx + dy * dy;
var dist:Number = Math.sqrt(distSQ );
var force:Number = partA.mass * partB.mass / distSQ;
var ax:Number = force * dx / dist;
var ay:Number = force * dy / dist;
partA.vx += ax / partA.mass;
partA.vy += ay / partA.mass;
partB.vx -= ax / partB.mass;
partB.vy -= ay / partB.mass;
}

-----------------------------------------------------------
边界与摩擦力

处理出界对象:
if ( sprite.x - sprite.width / 2 > right ||
sprite.x +sprite.width / 2 < left ||
sprite.y - sprite.height / 2 > bottom ||
sprite.y + sprite.height / 2 < top )
{
// 移除对象代码(或 重置对象代码)
}

屏幕环绕出界对象:
if ( sprite.x - sprite.width / 2 > right ) {
sprite.x = left – sprite.width / 2;
} else if ( sprite.x + sprite.width / 2 < left ) {
sprite.x = right + sprite.width / 2;
}
if ( sprite.y - sprite.height / 2 > bottom ) {
sprite.y = top – sprite.height / 2;
} else if ( sprite.y + sprite.height / 2 < top ) {
sprite.y = sprite.y + sprite.height / 2;
}

摩擦力应用(正确方法):
speed = Math.sqrt ( vx*vx + vy*vy );
angle = Math.atan2 ( vy,vx );
if ( speed > friction ) {
speed -= friction;
} else {
speed = 0;
}
vx = Math.cos(angle) * speed;
vy = Math.sin(angle) * speed;

摩擦力应用(简便方法):
vx *= friction;
vy *= friction;

-----------------------------------------------------------