4

我有一个复杂的问题,它涉及对我没有信心的数学的理解。

一些轻微的上下文可能会有所帮助。我正在为儿童构建一个 3D 火车模拟器,它将使用 WebGL 在浏览器中运行。我正在尝试创建一个点网络来放置轨道资产(见图)并为火车移动提供参考。

为了帮助解释我的问题,我创建了一个可视化表示,因为我是一个可以编写脚本的设计师,而不是真正的程序员或数学家:

问题的可视化

基本上,我有 3 个形状(图 A、B 和 C),虽然它们有宽度,但可以表示为 A 的直线和曲线(B 和 C)。曲线 B 和 C 是从 A 派生的(弯曲修改),因此长度 (l) 都相同,即 112。曲线 (B 和 C) 的半径 (r) 均为 285.5,弯曲的 (a) 角度为 22.5°。

每个形状(A、B 和 C)都有一个注册点(起点),由附在每个形状上的绿色框的中心表示。

我想要做的是创建一个从 0, 0 开始的“轨道”网络(使用标准笛卡尔坐标)。

我的问题是在曲线之后放置下一个元素的位置。如果它是直线轨道,那么没有问题,因为我可以将长度用作沿 y 轴的恒定偏移,但这会很无聊,所以我需要添加曲线。

图 D. 演示了一个可能的轨道布局示例,但请理解我不是在寻找静态答案(基于图像中所有内容的位置),我需要一个可以应用的公式,无论我如何配置追踪。

使用图 D。我试图找出在第一个弯曲元素之后放置第二个弯曲元素的位置。在给定圆心坐标和半径的情况下,我使用公式绘制圆的圆周点(图 E)。

我有第 1 点,因为这只是设置直线长度(y 位置)的情况。我可以很容易地计算出圆心,因为这只是 y 位置的偏移量、半径 (r) 的偏移量(x 位置)和始终为 22.5° 的角度 (a)(顺便说一下,它被转换为弧度根据公式要求)。

通过公式传递值后​​,我没有得到正确的结果,因为公式假设我从 3 点开始逆时针工作,所以我必须从 (a) 中减去 180 并将其转换为弧度以获得预期结果。

这确实有效,如果我想创建一个 180° 的轨道曲线,我可以使用相同的中心点,每次只需从角度减去 22.5°。伟大的。但我想要一个更动态的轨道布局,如无花果。D&E。

那么,我将如何处理图 E 中的工作点 5,因为它代表该曲线段的中心点?我根本不知道。

另外,作为一个额外的问题,这是这样做的正确方法还是我让事情变得过于复杂?

这个问题是阻止我构建游戏的唯一问题,正如您所理解的,这有点大问题,所以我提前感谢任何人的贡献。

4

2 回答 2

7

在构建轨道时,要放置的下一段轨道的位置需要相对于轨道当前末端的位置和方向。

我将存储一个 ( x, y) 位置和一个角度a来指示当前点(其中xy从 0 开始,a从 pi/2 弧度开始,这对应于“从 3 点钟方向逆时针”系统中的直线向上)。

然后构造

fx = cos(a);
fy = sin(a);
lx = -sin(a);
ly = cos(a);

它对应于相对于我们当前面对的方向的“向前”和“左”向量的 x 和 y 分量。如果我们想将我们的位置向前移动一个单位,我们将 (x,y) 增加 (fx, fy)。

在您的情况下,放置直线段的规则是:

x=x+112*fx
y=y+112*fy

放置曲线的规则稍微复杂一些。对于右转的曲线,我们需要向前移动 112*sin(22.5°),然后右转 112*(1-cos(22.5°),然后顺时针转 22.5°。在代码中,

x=x+285.206*sin(22.5*pi/180)*fx // Move forward
y=y+285.206*sin(22.5*pi/180)*fy

x=x+285.206*(1-cos(22.5*pi/180))*(-lx) // Side-step right
y=y+285.206*(1-cos(22.5*pi/180))*(-ly)

a=a-22.5*pi/180 // Turn to face new direction

左转和右转一样,只是角度为负。

要放置后续部件,只需再次运行此过程,计算fx、和fylx然后ly使用现在更新的值,a然后根据接下来的轨道部件类型递增。xy

您可能会考虑另一点;根据我的经验,如果您坚持进行 90° 转弯或相当对称的布局,则通常可以使用此类部件构建形成闭合循环的轨道。然而,制作没有完全连接的轨道是很容易的,而且不知道应该如何修改它们以允许它们连接。如果您的程序允许孩子们设计自己的布局,请记住一些事情。

于 2013-01-16T17:21:05.353 回答
0

点 5 与 3 和 2 等距,但方向相反。

于 2013-01-16T13:47:47.357 回答