如何在openGL中计算运动

如何在openGL中计算运动,第1张

如何在openGL中计算运动

方程式不是神秘的……它只是椭圆的参数方程式(变形圆)……让我通过其推导来解释:

  1. 2D xy平面圆:
    x=x0+r*cos(t)

    y=y0+r*sin(t)

这里

(x0,y0)
是圆心,
r
是圆半径,
t=<0.0,2.0*Pi>
是确定所需圆点的角度参数。

  1. 2D xy平面轴对齐的椭圆
    x=x0+rx*cos(t)

    y=y0+ry*sin(t)

我们只是在每个轴上使用不同的半径。

rx,ry
半轴也是如此。

  1. 3D椭圆

如果将 #2 椭圆旋转3D,
则可以得到任何椭圆。为了简单起见,我们可以沿一个轴旋转,将一个椭圆坐标分成两个…所以如果我重写为方程式:

        x=sin(t)*4    y=sin(t)    z=cos(t)*2

表示

z
椭圆的起始轴(角度
0
原轴
x
),并且轴
x,y
是原
y
轴的旋转部分。椭圆居中,
(0,0,0)
并具有半轴
2.0
sqrt(1^2+4^2)

现在,如果我们将

t
系统时间缩放到一定速度,则

t = amt  = 2.0*Pi*system_time/T

T
您的运动时间在哪里?

现在,当您使用绝对平移时,您可以将对象沿椭圆移动到适当的位置。如果使用相对平移,则速度由该椭圆驱动,从而导致更复杂的轨迹。如果您想让真实的物理学使用牛顿D’Alembert物理学并通过更改加速度来驱动对象,则这只是虚假的运动模拟。

因此,要回答第二个问题,请使用 Newton D’Alembert矢量数学 。我假设 3D
。因此,让您的立方体具有位置速度和加速度。

    // init do this just once    pos=(0,0,0); // [m] start position    vel=(0,0,0); // [m/s] start velocity    acc=(0,-9.81,0); // [m/s^2] acceleration on object (gravity in -y direction)    // on some timer or before render ...    vel+=acc*dt;    pos+=vel*dt;    cube.translate(pos); // absolute translation of your cube

dt[s]
从上一次计算开始经过的时间在哪里,因此对于计时器而言,它是其间隔(以秒为单位)。您可以使用任何单位,但所有单位之间必须兼容
pos,vel,acc

您可以添加以下摩擦:

acc+=k*vel*|vel|; // acc += k*vel^2

其中

k
是在空气中的摩擦系数(在液体它会
k*vel^3
)比要少得多
1.0

要驱动物体,可以使用驱动力…

acc += F/m;

这里

F
是驱动力的总和
m
是你的对象的质量。

所有这些也可以针对角度(方向)完成,因为它具有相似之处

alpha   -> posomega   -> velepsilon -> acc

并使用绝对旋转对象

alpha



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/4918642.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-12
下一篇 2022-11-12

发表评论

登录后才能评论

评论列表(0条)

保存