如何在openGL中计算运动

时间:2017-09-08 00:58:34

标签: algorithm opengl

我无法使用JOGL计算我想要的动作。本书中的示例莫名其妙地使用了sin()的{​​{1}}和cos()

System.timeInMillis()

这一切都很好,问题是我想知道他们从哪里得到这些数字以及如何计算,以及其他一些顺利下降的立方体。

stack.translate(Math.sin(amt)*4.0f, Math.sin(amt) * 1.0f, Math.cos(amt)*2.0f);

诀窍,但它是有限的。是否有任何资源可以指导如何使用这些神秘的int pos = 1; stack.translate(0.0, --pos, 0.0); sin()函数以非常特定的方式控制运动?

我现在正在调查相关问题。我所需要的只是某种参考,我甚至不知道该怎么称呼这类事情进行研究;流体动力学? 3D三角图形运动? 3D牛顿物理学?

1 个答案:

答案 0 :(得分:2)

这个等式并不神秘......它只是椭圆的参数方程(扭曲的圆圈)......让我通过推导来解释:

  1. 2D xy平面圆圈:

    x=x0+r*cos(t)
    y=y0+r*sin(t)
    

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

  2. 2D xy平面轴对齐椭圆

    x=x0+rx*cos(t)
    y=y0+ry*sin(t)
    

    我们每轴只使用不同的半径。所以rx,ry也是半轴。

  3. 3D椭圆

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

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

    表示z是椭圆的起始轴(角度0前轴x),x,y轴是前y轴的旋转部分。椭圆以(0,0,0)为中心,并具有半轴2.0sqrt(1^2+4^2)

  4. 现在,如果我们将t更改为系统时间缩放到某个速度,那么

    t = amt  = 2.0*Pi*system_time/T
    

    T是您的行动期。

    现在,当您使用绝对平移时,您将对象移动到沿椭圆的位置。如果使用相对平移,则速度由此椭圆驱动,从而导致更复杂的轨迹。如果您想要使用真实物理Newton D'Alembert physics并通过改变加速度来驱动您的物体,那么这只是伪动作模拟。

    如果你想制作人类驱动的物体,请看一下最后的链接:

    对于行星运动,请参阅:

    所以要回答你的第二个问题,请使用 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   -> pos
    omega   -> vel
    epsilon -> acc
    

    并使用alpha对象的绝对旋转。