avo*_*rum 1 physics vector actionscript-3
我正在使用AS3为Flash游戏编写一些碰撞检测程序,并且无法弄清楚如何从一条线上弹出一个球.我跟踪一个代表球的2D速度的矢量,我试图将其反射到垂直于球与之碰撞的线(也就是正常线)的矢量上.我的问题是我不知道如何找出新的向量(这反映在正常情况下).我想你可以使用Math.atan2找到法线和球的矢量之间的差异,但我不知道如何扩展它来解决我的问题.
向量代数 -你想要"反弹"向量:
vec1是球的运动向量,vec2是表面/线向量:
// 1. Find the dot product of vec1 and vec2
// Note: dx and dy are vx and vy divided over the length of the vector (magnitude)
var dpA:Number = vec1.vx * vec2.dx + vec1.vy * vec2.dy;
// 2. Project vec1 over vec2
var prA_vx:Number = dpA * vec2.dx;
var prA_vy:Number = dpA * vec2.dy;
// 3. Find the dot product of vec1 and vec2's normal
// (left or right normal depending on line's direction, let's say left)
var dpB:Number = vec1.vx * vec2.leftNormal.dx + vec1.vy * vec2.leftNormal.dy;
// 4. Project vec1 over vec2's left normal
var prB_vx:Number = dpB * vec2.leftNormal.dx;
var prB_vy:Number = dpB * vec2.leftNormal.dy;
// 5. Add the first projection prA to the reverse of the second -prB
var new_vx:Number = prA_vx - prB_vx;
var new_vy:Number = prA_vy - prB_vy;
Run Code Online (Sandbox Code Playgroud)
将这些速度分配给球的运动矢量并让它反弹.
PS:
vec.leftNormal - > vx = vec.vy; vy = -vec.vx;
vec.rightNormal - > vx = -vec.vy; vy = vec.vx;
| 归档时间: |
|
| 查看次数: |
1623 次 |
| 最近记录: |