坐标旋转可能看名字很复杂,其实就是转化为我们物理学上的一些坐标系分析的一个方法,只不过在最后运动的时候我们还得将我们坐标旋转得到的东西重新转化为显示屏上面的标准坐标系上的运动来完成一些列操作。至于台球物理当然一个轴上的并不复杂,两个轴上同样也得用到坐标旋转所以放在一起讲解。
上一次总结了碰撞,反角今天总结的和碰撞有很深的关联因此一并总结一下,以备以后的套用提供方便。
0、碰撞处理与坐标旋转
上一次我们只是简单总结了如何判定碰撞条件,至于碰撞的处理我们并没有多谈,所以先谈一下碰撞处理的分解步骤。坐标旋转主要发生子啊下面的0.1,0.3~0.4的过程中
0.1、获取碰撞点坐标
0.2、停止在碰撞点
0.3、坐标旋转计算相应的速度变化
0.4、转化为标准坐标系速度
0.5、发生运动变化
1、角度回弹
//获取斜面的正弦、余弦和角度 var angle:Number = line.rotation * Math.PI / 180; var cos:Number = Math.cos(angle); var sin:Number = Math.sin(angle); //获取小球相对于斜面的位置 var x1:Number = ball.x - line.x; var y1:Number = ball.y - line.y; //旋转坐标 var x2:Number = cos * x1 + sin * y1; var y2:Number = cos * y1 - sin * x1; //旋转速度 var vx1:Number = cos * ball.vx + sin * ball.vy; var vy1:Number = cos * ball.vy - sin * ball.vx; //判定碰撞点(碰撞条件) if(y2 > -ball.height / 2){ y2 = -ball.height / 2; vy1 * = bounce //发生回弹 } //转化回来 x1 = cos * x2 - sin * y2; y1 = cos * y2 + sin * x2; ball.vx = cos * vx1 - sin * vy1; ball.vy = cos * vy1 + sin * vx1; //发生位移变化,将相对位移转化为标准坐标系下位移变化 ball.x = line.x + x1; ball.y = line.y + y1;
当然代码亦可以优化,可以将转化的的步骤(if语句下面的代码)放置在if语句内部处理,将
var vx1:Number = cos * ball.vx + sin * ball.vy;
也放置在if语句内部。因为碰撞仅发生时的转化后y轴方向速度存在损耗。也就是垂直于斜面的速度发生损耗,这个符合物理学的。至于多角度回弹那就不用多举例了,一样的。参数设置为斜面即可了。
2、台球物理
动量守恒以及能量守恒公式,我想大家应该不会陌生这些都是高中物理学的基本知识,虽然大学四年可能忘得差不多了,但是捡起来应该还是很容易,所以这里直接就上公式了,不做过多的介绍了。
var v1:Number = ((m1 - m2)*v1 + 2 * m2 * v2 )/(m1 + m2) var v2:Number = ((m1 - m2)*v2 + 2 * m1 * v1)/(m1 + m2)
只不过二维条件下的,球形碰撞反弹就麻烦了一些。但是也是基于坐标旋转的公式,只不过相对以后,其中一个球的位置设为零,另一个发生相对应的变化,其他基本就和上面提到的坐标旋转方法一致了,只不过两个球都得发生坐标旋转。并且得求出相对后,x方向上的动量及能力守恒发生的速度变化。
最后将为之转换回去,调整标砖坐标系下坐标,再将速度转换回去即可。很麻烦不是,可以自己封装一个函数咯。