坐标网格中球的真实反弹(离线)
Realistic Bounce of Ball (off Line) in Coordinate Grid
问题
所以我正在尝试编写一个程序,通过计算球与线的角度(如果它是一条相交线)并旋转该线来创建球从线反弹交点以找到新的坡度。我拥有所有 algorithms
和公式,除了我将斜率交还给球动量的部分。所有计算的最终结果(我已经确定有效)是直线的斜率和交点,或反弹点。如果我只有一个斜坡,我怎么知道反弹后球在斜坡上的运动方向?
旁注:
我正在使用的语言是 Java 1.8
和一些任意的外部 graphics library
,但我不是在寻找代码来插入我已有的代码,我是在寻找你认为我的总体思路也许可以做到。此外,对问题至关重要的是,整个项目都是基于坐标的。
非常感谢您提供任何意见或可能的答案,并询问我是否需要有关该问题的说明!
https://cwynn.com/ball-bounce/ 是我几年前做的一个 html5 canvas 小东西,它说明了 op 想要如何处理 'bounce'
你有你的球 B,它将在碰撞点 C 上击中一条直线 L。B->C 形成一条直线。在 C 之外的那条直线上取一个点并将其反射到 L 以获得反射点 R。当球击中 C 时,您可以删除它的方向向量,并给它 C->R 的向量。你需要重置他们的速度。所以获取方向向量的大小,并缩放新的方向向量以匹配。
编辑:决定添加代码(这让我意识到我忘记了缩放它们的速度)
//closestCollPt[0] is the line the 'player' will hit next
var dist = player.position.dist(closestCollPt[0]);
//the 'player' in my case is a circle, so this indicates collision
if(dist < player.radius*2)
{
//the collision point to the reflection like I mentioned
//in the text above
var newDir = closestCollPt[0].vecTo(reflection);
//I break out their parts, b/c I want to scale the vector
//doable in one line, but hard to debug
var newDirX = newDir.x;
var newDirY = newDir.y;
var newDirDist = newDir.dist(new Vector(0,0));
//for whatever reason I was calling the size of a vector
//'dist' when I wrote this
var currDirDist = player.direction.dist(new Vector(0,0));
//give the player the direction we got from Coll->Ref
//scale it so their speed doesn't change
player.direction = newDir.scale(currDirDist).scale(1/newDirDist);
}
决定添加图片...
唯一的'real'东西是球和棕线
'ball'是粉色的,
朝向射线 'path'、
中心的 'contact' 点
投影是球越过接触点的反射,反射是投影点越过直线的反射。
一旦球接触到棕色线,它的方向矢量应该从 'path' 变为 'new path'(位于接触和反射上的线)
问题
所以我正在尝试编写一个程序,通过计算球与线的角度(如果它是一条相交线)并旋转该线来创建球从线反弹交点以找到新的坡度。我拥有所有 algorithms
和公式,除了我将斜率交还给球动量的部分。所有计算的最终结果(我已经确定有效)是直线的斜率和交点,或反弹点。如果我只有一个斜坡,我怎么知道反弹后球在斜坡上的运动方向?
旁注:
我正在使用的语言是 Java 1.8
和一些任意的外部 graphics library
,但我不是在寻找代码来插入我已有的代码,我是在寻找你认为我的总体思路也许可以做到。此外,对问题至关重要的是,整个项目都是基于坐标的。
非常感谢您提供任何意见或可能的答案,并询问我是否需要有关该问题的说明!
https://cwynn.com/ball-bounce/ 是我几年前做的一个 html5 canvas 小东西,它说明了 op 想要如何处理 'bounce'
你有你的球 B,它将在碰撞点 C 上击中一条直线 L。B->C 形成一条直线。在 C 之外的那条直线上取一个点并将其反射到 L 以获得反射点 R。当球击中 C 时,您可以删除它的方向向量,并给它 C->R 的向量。你需要重置他们的速度。所以获取方向向量的大小,并缩放新的方向向量以匹配。
编辑:决定添加代码(这让我意识到我忘记了缩放它们的速度)
//closestCollPt[0] is the line the 'player' will hit next
var dist = player.position.dist(closestCollPt[0]);
//the 'player' in my case is a circle, so this indicates collision
if(dist < player.radius*2)
{
//the collision point to the reflection like I mentioned
//in the text above
var newDir = closestCollPt[0].vecTo(reflection);
//I break out their parts, b/c I want to scale the vector
//doable in one line, but hard to debug
var newDirX = newDir.x;
var newDirY = newDir.y;
var newDirDist = newDir.dist(new Vector(0,0));
//for whatever reason I was calling the size of a vector
//'dist' when I wrote this
var currDirDist = player.direction.dist(new Vector(0,0));
//give the player the direction we got from Coll->Ref
//scale it so their speed doesn't change
player.direction = newDir.scale(currDirDist).scale(1/newDirDist);
}
决定添加图片...
唯一的'real'东西是球和棕线
'ball'是粉色的, 朝向射线 'path'、
中心的 'contact' 点投影是球越过接触点的反射,反射是投影点越过直线的反射。
一旦球接触到棕色线,它的方向矢量应该从 'path' 变为 'new path'(位于接触和反射上的线)