gpt4 book ai didi

java - 计算球/点的弹跳角度

转载 作者:行者123 更新时间:2023-12-01 19:26:55 24 4
gpt4 key购买 nike

我正在构建自己的小型游戏引擎来学习。所以基本上是纯Java的。我有由起点和终点(x 和 y 坐标)定义的线

现在我有一个带有速度 vector 的球。我想从墙上“弹跳”,它可以以任何可能的角度定位。碰撞发生后如何找出新的速度 vector ?我知道点 S、P1 和 P2(见图)

enter image description here

我考虑过计算角度,并更改 x 和 y 分量。但我找不到一种方法来对所有可能的角度执行此操作。

我可以找到许多与 Canvas 边界平行的墙壁的解决方案,但没有通用的解决方案。 “大型”游戏引擎如何处理这个常见问题?

编辑:

我更新的 Vector 类方法:

public static Vector bounce(Vector normal, Vector velocity) {
Vector tmp = Vector.multiplication(2*Vector.dot(normal,velocity), normal);
return Vector.addition(tmp, velocity);
}

public static Vector multiplication(double multi, Vector n) {
Vector new_vector = new Vector(n.x * multi, n.y * multi);
return new_vector;
}

public static double dot(Vector a, Vector b) {
return a.x*b.x + a.y*b.y; // + a.z*b.z if you're in 3D
}

我的测试功能:

@Test
public void testBounce() {
Vector normal_vector_corrected = new Vector(0, 1);
Vector start_velocity = new Vector(3, -3);
Vector bounced_vector = Vector.bounce(normal_vector_corrected, start_velocity);
System.out.println("normal vector: "+normal_vector_corrected);
System.out.println("start_velocity: "+start_velocity);
System.out.println("bounced_vector "+bounced_vector);
}

输出是这样的:

normal vector: <Vector x=0,00, y=1,00>
start_velocity: <Vector x=3,00, y=-3,00>
bounced_vector <Vector x=3,00, y=-9,00>

根据我的计算,bounced_vector 应该是 x=3,y=3。我的错误在哪里? (我的例子如图:)enter image description here

编辑2:我发现它必须是return Vec.add(tmp, v);。此外,我必须反转速度 vector 。

最佳答案

“弹跳速度 vector ”v' 是从原始速度 v表面法线单位 vector n2(n . v)n + v 其中 . 代表 vector 点积。这通常称为反射;速度 vector 反射(reflect)在表面法线上。

如果您不熟悉术语,表面法线是垂直于表面(呈 90 度角)的 vector 。单位 vector 是长度为 1 的 vector 。

enter image description here

我假设您已经有一个表示 vector 的类,称为 Vec,其中包含将 vector 与标量相乘以及将两个 vector 相加的方法。您可以将反弹操作编写为:

static Vec bounce(Vec n, Vec v) {
Vec tmp = Vec.scalarMultiply(-2*Vec.dot(n,v), n);
return Vec.add(tmp, v);
}

static double dot(Vec a, Vec b) {
return a.x*b.x + a.y*b.y; // + a.z*b.z if you're in 3D
}

至于如何获得表面法线,这取决于你是在 2D 还是 3D 中。假设是 2D,很简单:如果 (x,y) 是从 P1 到 P2 的 vector ,则 (-y,x) 与其垂直,并且 一个单位正常情况是:

n = (-y/sqrt(x*x+y*y), x/sqrt(x*x+y*y))

另一个可能的单位法线是-n。您可以根据您所在表面的哪一侧来使用其中之一。

您应该将法线 vector 与场景的几何形状一起存储,这样您就不必每次都计算它。

关于java - 计算球/点的弹跳角度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61272597/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com