Actionscript 3 如何将一个向量反射到另一个向量上?
我正在使用AS3为一个flash游戏编写一些碰撞检测程序,我很难弄清楚如何将球弹离直线。我跟踪一个表示球的2D速度的向量,并试图将它反射到垂直于球碰撞线的向量上(也就是法线)。我的问题是,我不知道如何计算新的向量(它反映在法线上)。我想你可以使用Math.atan2来找出法线和球的向量之间的差异,但我不确定如何展开它来解决我的问题。计算向量的两个分量 一个分量是向量在反射面上的投影,另一个分量是曲面法线上的投影(你说你已经有了)。使用点积获得投影。通过对两个向量求和,将这两个分量相加。你会得到你的答案的 甚至可以将第二个分量A2计算为原始向量减去第一个分量,因此:A2=A-A1。然后你想要的向量是A1加上反射的A2(因为它垂直于你的表面,所以简单地说是-A2),或者: Ar=A1-A2 或 Ar=2A1-A,与Ar=-(2A2-A)相同 如果[Ax,Bx]是球的速度,[Wx,Wy]是表示墙的单位向量: A1x=(Ax*Wx+Ay*Wy)*Wx A1y=(Ax*Wx+Ay*Wy)*Wy Arx=2*A1x-AxActionscript 3 如何将一个向量反射到另一个向量上?,actionscript-3,vector,physics,Actionscript 3,Vector,Physics,我正在使用AS3为一个flash游戏编写一些碰撞检测程序,我很难弄清楚如何将球弹离直线。我跟踪一个表示球的2D速度的向量,并试图将它反射到垂直于球碰撞线的向量上(也就是法线)。我的问题是,我不知道如何计算新的向量(它反映在法线上)。我想你可以使用Math.atan2来找出法线和球的向量之间的差异,但我不确定如何展开它来解决我的问题。计算向量的两个分量 一个分量是向量在反射面上的投影,另一个分量是曲面法线上的投影(你说你已经有了)。使用点积获得投影。通过对两个向量求和,将这两个分量相加。你会得到你
Ary=2*A1y-Ay 计算向量的两个分量 一个分量是向量在反射面上的投影,另一个分量是曲面法线上的投影(你说你已经有了)。使用点积获得投影。通过对两个向量求和,将这两个分量相加。你会得到你的答案的 甚至可以将第二个分量A2计算为原始向量减去第一个分量,因此:A2=A-A1。然后你想要的向量是A1加上反射的A2(因为它垂直于你的表面,所以简单地说是-A2),或者: Ar=A1-A2 或 Ar=2A1-A,与Ar=-(2A2-A)相同 如果[Ax,Bx]是球的速度,[Wx,Wy]是表示墙的单位向量: A1x=(Ax*Wx+Ay*Wy)*Wx A1y=(Ax*Wx+Ay*Wy)*Wy Arx=2*A1x-Ax
Ary=2*A1y-Ay 向量代数-您想要“反弹”向量:
vec1是球的运动矢量,vec2是曲面/线矢量:
将这些速度指定给球的运动矢量,然后让它反弹。
PS:
vec.leftNormal-->vx=vec.vy;vy=-vec.vx;
vec.rightNormal-->vx=-vec.vy;vy=vec.vx 向量代数-您想要“反弹”向量:
vec1是球的运动矢量,vec2是曲面/线矢量:
将这些速度指定给球的运动矢量,然后让它反弹。
PS:
vec.leftNormal-->vx=vec.vy;vy=-vec.vx;
vec.rightNormal-->vx=-vec.vy;vy=vec.vx 任何向量v从任意维法线n的线/(超)曲面的镜像反射都可以使用投影张量计算。v在n上的平行投影是:v|=(vn)n=vnn。这里,nn是法线与自身的外积(或张量)。在笛卡尔坐标系中,它是一个包含元素的矩阵:
nn[i,j]=n[i]*n[j]
。垂直投影只是原始向量与其平行投影之间的差值:v-v|124;。当矢量被反射时,其平行投影被反转,而垂直投影被保留。所以反射向量是:
v=-v|+(v-v|+)=v-2v。(I-2nn)=vR(n),其中R(n)=I-2nn (I是单位张量,在笛卡尔坐标系中,它只是对角线单位矩阵diag(1)) R称为反射张量。在笛卡尔坐标系中,它是一个实对称矩阵,其分量为
R[i,j]=delta[i,j]-2*n[i]*n[j]
,其中delta[i,j]=1
如果i==j
则为0
。它也与n对称:
R(n)=I-2(n)(n)=I-2nn(n)
因此,无论是使用朝外法线还是朝内法线,结果都是一样的
在二维和笛卡尔坐标中,R
(R的矩阵表示形式)变为:
然后将反射向量的分量计算为行向量矩阵乘积:
v1.x = v.x*R00 + v.y*R10
v1.y = v.x*R01 + v.y*R11
或在扩展后:
k = 2.0*(v.x*n.x + v.y*n.y)
v1.x = v.x - k*n.x
v1.y = v.y - k*n.y
在三个方面:
k = 2.0*(v.x*n.x + v.y*n.y + v.z*n.z)
v1.x = v.x - k*n.x
v1.y = v.y - k*n.y
v1.z = v.z - k*n.z
找到球撞击线/墙的确切点更为复杂-请参见。任何向量v从任何维度的法线n的线/(超)曲面的镜像可以使用投影张量计算。v在n上的平行投影是:v|=(vn)n=v
k = 2.0*(v.x*n.x + v.y*n.y)
v1.x = v.x - k*n.x
v1.y = v.y - k*n.y
k = 2.0*(v.x*n.x + v.y*n.y + v.z*n.z)
v1.x = v.x - k*n.x
v1.y = v.y - k*n.y
v1.z = v.z - k*n.z