这是我正在制作的一个坦克游戏的需求
请看图片以获得更清晰的想法:链接文本
我想预先计算精确的角度以击中 T2 点。
T1:起始点
T2:目标点
V1(a,b):线
反射点:这是我正在寻找的:)
编辑:如果能看到一些“代码”就好了:p
回答:
了解光线/向量在反射过程中会发生什么变化很有用。维基百科为此提供了一张很好的图片:
在上面的图片中,对于一个完美的反射,两个角度是相同的。
现在,这和您有什么关系呢? 让我们再次看一下您的情况。
请注意,由于反射定律,角度a
和b
相等。这对我们有好处,因为如果我们知道这一点,我们也知道c
和d
也相等!(它们是直角三角形)
所以我们知道:
a = b
c = d
我们很快意识到我们有相似的三角形。这意味着,对应的边彼此成比例。 意思是,在数学上:
A / C = B / D
A / B = C / D
A / (A+B) = B / (A+B) = C / P = D / P
因此,如果您知道A
和B
(您应该知道),则可以通过将C
添加到交点的 x 值来找到您的反射点。
您可以通过以下方式找到 C:
给定:
A (射击坦克到墙的距离)
B (目标坦克到墙的距离)
P (两点之间的 x 距离)
查找:
C (射击坦克到墙被击中的 x 距离)
A / (A+B) = C / P
C = A*P / (A+B) <- 就在这里
例如,如果您的第一辆坦克位于(1,5)
,第二辆坦克位于(3,7)
,并且您的墙是 x 轴:
A = 5
B = 7
P = 3-1 = 2
因此:
C = 5*2 / (5+7)
= 10/12
= 5/6
因此,如果您的坦克想要击中位于(3,7)
的坦克,则应该朝(0,5/6)
射击。
对于更通用的解决方案:
如果墙是 X 轴,并且您的射击坦克位于 (s_x,s_y),
并且击中坦克位于 (h_x,h_y),则要射击的点是:
[ s_x + s_y * (h_x-s_x) / (h_y + s_y), 0 ]
替代方案:具有任意墙壁位置/方向
上述解决方案的问题在于,您的墙壁必须是您的 x 轴。如果不是呢?
首先,您需要找到每个点到墙壁的距离 – A
和B
:
- 找到
w
,它是墙壁方向上的单位向量。 - 从
w
找到v
,它是垂直于墙壁的单位向量。如果w = [x,by]
,v = [-y,x]
。 - 找到
r_s
,它是从您的射击坦克到墙上任何已知点的向量。 - 找到
r_h
,它是从您的击中坦克到墙上任何已知点的向量。 - 距离
A = | v . r_s |
,其中.
是点积运算符。 这可以通过[l,m] . [n,o] = l*n + m*o
找到 - 距离
B = | v . r_h |
找到A
和B
后,找到P
,它是平行于墙壁的距离。 为此:
- 找到
q
,它是从击中坦克到射击坦克的向量 - 距离
P = | w . q |
现在您有了A
,B
和P
,您有两种方法可以解决:
-
找到墙上要瞄准的点,首先使用上述方法求解 C,然后找到从您的射击坦克开始的
v
与您的墙的交点,并将C*w
添加到该交点。 -
您可以找到必须射击的角度(从
v
开始),它是P/(A+B)
的反切线。