【问题标题】:How to calculate motion in openGL如何在openGL中计算运动
【发布时间】:2017-09-08 00:58:34
【问题描述】:

我无法使用 JOGL 计算我想要的动作。书中的例子莫名使用了System.timeInMillis()的sin()和cos()。

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() 和 cos() 函数以非常具体的方式控制运动?

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

【问题讨论】:

  • 它们用于旋​​转。谷歌“变换+计算机图形”。
  • 如何计算运动取决于您想要模拟/实现的运动类型。如果它应该是实时的或尽可能准确。如果运动的物体与其他物体相互作用,它是否会受到空气的影响,......你的问题含糊不清。 SO 是一个就您的代码遇到的具体问题提出问题的地方。

标签: algorithm opengl


【解决方案1】:

这个方程并不神秘......它只是一个椭圆的参数方程(扭曲的圆)......让我解释一下它的推导:

  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.0 和sqrt(1^2+4^2)。

现在,如果我们更改 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 使用对象的绝对旋转。

【讨论】:

  • 宾果游戏感谢 spektre。我实现了你的第二种方法:
  • vel+=accdt; pos+=veldt; cube.translate(pos) 效果很好,我的金字塔正像你想象的那样旋转。我将如何计算坠落的物体?或者这就是这个人应该做的,我做错了什么。
  • @madmax 代码已经用于在y- 方向下降如果你的视图被转动并且没有透视那么它可能在视图方向下降所以你看不到它......在这种情况下移动-9.81 中的 acc 到不同的轴。看看这个How to implement a constraint solver for 2-D geometry? 这是一个更复杂的工作示例,使用字段来计算几何问题......同时检查你的单位,它们应该在同一个系统中的所有变量,如 SI ......或缩放正确
猜你喜欢
  • 1970-01-01
  • 2012-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多