Actionscript 3 如何将一个向量反射到另一个向量上?

Actionscript 3 如何将一个向量反射到另一个向量上?,actionscript-3,vector,physics,Actionscript 3,Vector,Physics,我正在使用AS3为一个flash游戏编写一些碰撞检测程序,我很难弄清楚如何将球弹离直线。我跟踪一个表示球的2D速度的向量,并试图将它反射到垂直于球碰撞线的向量上(也就是法线)。我的问题是,我不知道如何计算新的向量(它反映在法线上)。我想你可以使用Math.atan2来找出法线和球的向量之间的差异,但我不确定如何展开它来解决我的问题。计算向量的两个分量 一个分量是向量在反射面上的投影,另一个分量是曲面法线上的投影(你说你已经有了)。使用点积获得投影。通过对两个向量求和,将这两个分量相加。你会得到你

我正在使用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-Ax


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的线/(超)曲面的镜像反射都可以使用投影张量计算。vn上的平行投影是:v|=(vnn=vnn。这里,nn是法线与自身的外积(或张量)。在笛卡尔坐标系中,它是一个包含元素的矩阵:
nn[i,j]=n[i]*n[j]
。垂直投影只是原始向量与其平行投影之间的差值:v-v|124;。当矢量被反射时,其平行投影被反转,而垂直投影被保留。所以反射向量是:

v=-v|+(v-v|+)=v-2v。(I-2nn)=vRn),其中
Rn)=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对称:

Rn)=I-2(n)(n)=I-2nnn

因此,无论是使用朝外法线还是朝内法线,结果都是一样的

在二维和笛卡尔坐标中,
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的线/(超)曲面的镜像可以使用投影张量计算。vn上的平行投影是:v|=(vnn=vk = 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