Math 游戏开发中的三角数学

Math 游戏开发中的三角数学,math,javafx,trigonometry,Math,Javafx,Trigonometry,我试图制作一个三角形(等腰三角形)在屏幕上移动,同时当用户按下方向键(如向右或向左)时稍微旋转它 我希望三角形的鼻子(顶点)始终引导三角形。(就像那场古老的小行星游戏) 我的问题是这背后的数学。在每个X时间间隔,我希望三角形在“某个方向”上移动,我需要帮助找到这个方向(X和y递增/递减) 我可以找到三角形的中心点(质心),我有最上面的x和y点,所以我有一个线向量来处理,但没有一个关于如何处理它的线索 我认为这与旧的正反法以及三角形旋转的角度有关,但我对这些东西有点生疏了 非常感谢您的帮助。vy/

我试图制作一个三角形(等腰三角形)在屏幕上移动,同时当用户按下方向键(如向右或向左)时稍微旋转它

我希望三角形的鼻子(顶点)始终引导三角形。(就像那场古老的小行星游戏)

我的问题是这背后的数学。在每个X时间间隔,我希望三角形在“某个方向”上移动,我需要帮助找到这个方向(X和y递增/递减)

我可以找到三角形的中心点(质心),我有最上面的x和y点,所以我有一个线向量来处理,但没有一个关于如何处理它的线索

我认为这与旧的正反法以及三角形旋转的角度有关,但我对这些东西有点生疏了

非常感谢您的帮助。

vy/vx的反正切(逆切线),其中vx和vy是(质心->尖端)向量的组件,为您提供向量所面对的角度

但是,经典的反正切为您提供了一个标准化为-90° 幸运的是,您的标准库应该提供一个atan2()函数,该函数将vx和vy分别作为参数,并返回0°和360°或-180°和+180°之间的角度。它还将处理vx=0的特殊情况,如果您不小心,这将导致被零除

请参阅或仅搜索“反正切”

编辑:为了清晰起见,我在文章中使用了度,但是Java和许多其他语言/库使用弧度,其中180°=π


您也可以将vx和vy添加到三角形的点上,使其在“前进”方向上移动,但请确保向量已规格化(vx²+vy²=1),否则速度将取决于三角形的大小。

在我看来,您需要存储三角形的旋转角度以及可能的当前速度

x' = x + speed * cos(angle)
y' = y + speed * sin(angle)
请注意,角度是弧度,而不是度

弧度=度*弧度面圆/度面圆

弧度曲面=2*Pi

度圆=360


对于顶点的位置,每个顶点都位于距中心一定距离和角度处。在进行此计算之前,请添加当前旋转角度。这与计算运动的数学相同。

将质心保持在原点。使用从质心到鼻子的矢量作为方向矢量。将旋转此向量。从该向量构造另外两个点。将三个点平移到屏幕上的位置并绘制。

我可以看出,我需要将常见的二维旋转公式应用到我的三角形中才能得到结果,我只是在不同组件之间的关系方面遇到了一点问题

double v; // velocity
double theta; // direction of travel (angle)
double dt; // time elapsed

// To compute increments
double dx = v*dt*cos(theta);
double dy = v*dt*sin(theta);

// To compute position of the top of the triangle
double size; // distance between centroid and top
double top_x = x + size*cos(theta);
double top_y = y + size*sin(theta);
aib声明:

的反正切(逆切线) vy/vx,其中vx和vy是 组件(质心->尖端) 向量,给你向量的角度 正面临着

vx和vy是中心点或尖端的x和y坐标吗?我想我对“向量”的术语感到困惑。我的印象是,向量只是2d(在本例中)空间中表示方向的一个点

在这种情况下,如何计算质心->尖端的矢量?只是中间点吗

meyahoocomlorenpechtel表示:


在我看来,你需要存储 三角形和三角形的旋转角度 可能是现在的速度

x' = x + speed * cos(angle)
y' = y + speed * sin(angle)
相对旋转角度是多少?三角形的原点,还是游戏窗口本身?另外,对于将来的旋转,角度是最后一次旋转的角度还是三角形的原始位置


谢谢大家到目前为止的帮助,我真的很感激

为了达到所需效果,您需要将最顶端的顶点作为质心。

@Mark:

我已经试着在这个答案框中写了两次关于向量、坐标、点和角度的入门,但两次都改变了主意,因为这会花费太长的时间,而且我确信有很多教程比我能更好地解释这些东西

质心和“尖端”坐标不是矢量;也就是说,把它们看作向量是没有任何好处的

可以通过从质心点减去“尖端”角的坐标来计算所需的矢量vForward=pTip-pCentroid。该向量的atan2()即atan2(tipY centY,tipX centX)给出三角形“面对”的角度

至于它与什么相关,这无关紧要。您的库可能会使用这样的约定,即递增的X轴(-->您所看到的所有2D图形上的右/东方向)为0°或0π。增加的Y(顶部,北部)方向将对应于90°或(1/2)π。

还有一些:

矢量表示位移。位移、平移、移动或任何你想称之为的东西,没有起点都是毫无意义的,这就是为什么我把上面的“向前”向量称为“从质心开始”,这就是为什么“质心向量”,质心点的x/y分量的向量没有意义。这些组件提供质心点相对于原点的位移。换句话说,pOrigin+vCentroid=pCentroid。如果从0点开始,然后添加表示质心点位移的向量,则得到质心点

请注意:

向量+向量=向量
(添加两个位移会产生第三个不同的位移)

点+向量=点
(移动/替换一个点会得到另一个点)

点+点=???
(添加两点没有意义;但是:)

点-p
int width = 6; //base
int height = 9;
angle = rotation_angle + vertex[1].angle;
dist = vertex[1].distance;    
p1_x = center_x + math.cos(angle) * dist;
p1_y = center_y - math.sin(angle) * dist;
// and the same for the other two points