青色,
您不是在寻找叉积或 3 维定义的法线。一分钟,我会解释..
编辑:
来自this answer,很明显您正在寻找的只是一个垂直于一条线的向量。不是垂直于平面的向量。
数学评估
R = A - 2<A, N> N
你首先要对Euclidean Vector有一个深刻的认识。
给定一个向量 A(你的入射角):
A = <ax, ay>
给定向量 B(表示被反弹的墙壁的向量):
B = <bx, by>
这个向量的法线(垂直)简单地旋转了 90 度。数学上:
N = <nx, ny> = <-bx, by>
因此 R =
R = A - 2<A, N> N = ...
让我们首先评估点积
<A, N> = ax*nx + ay*ny = ax*(-bx) + ay*by = ay*by - ax*bx
然后:
R = <ax, ay> - 2*(ay*by - ax*bx) * N
= <ax, by> - <2*(ay*by - ax*bx)*nx, 2*(ay*by - ax*bx)*ny>
= <ax, by> - <2*(ay*by - ax*bx)*(-bx), 2*(ay*by - ax*bx)*(by)>
= < ax + 2*bx*(ay*by - ax*bx), ay - 2*by*(ay*by - ax*bx) >
因此,您需要做的就是确定一个向量,该向量代表您要反弹的墙壁(即 B)和您的事件向量(即 A)。
编辑(因为评论):
您真的应该花时间查看我发布到欧几里得向量的链接...
基本思想是定义任意数学原点。 (例如,你的墙的底部)。代表你的墙的矢量只是一个箭头,从顶部到底部(或从底部到顶部)。以底部描述的原点为起点,此箭头将指向 x 方向上的 0 个单位,但指向 y 方向上的 100 个单位。因此,您的墙 (B) 向量就是:
B = < 0, 100 >
(请注意,墙的宽度并不重要 - 1px、50 px 或 100px 厚的墙会反弹)。
但是您需要对该向量进行归一化,使其具有单位大小(长度为 1)。于是向量变为:
B = <0, 1>
这来自:
Vector length = sqrt( bx^2 + by^2 ) = sqrt( 0^2 + 1^2 ) = 1
N 是:
N = <1, 0> // for the left hand side wall
N = <-1, 0> // for the right hand side wall