我在使用JOGL计算想要的运动时遇到了麻烦。书中的例子莫名其妙地使用sin()和cos()的System.timeInMillis()。
sin()
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()和cos()功能控制的运动,一个非常具体的方法是什么?
我正在调查相关问题。我所需要的只是某种参考,我什至不知道该称呼什么来进行研究。流体动力学?3D三角图形运动?3D牛顿物理学?
该方程式不是神秘的……它只是椭圆的参数方程式(变形圆)……让我通过其推导来解释:
x=x0+r*cos(t)
y=y0+r*sin(t)
这里(x0,y0)是圆心,r是圆半径,t=<0.0,2.0*Pi>是确定所需圆点的角度参数。
(x0,y0)
r
t=<0.0,2.0*Pi>
x=x0+rx*cos(t)
y=y0+ry*sin(t)
我们只是在每个轴上使用不同的半径。rx,ry半轴也是如此。
rx,ry
如果将 #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)。
z
0
x
x,y
y
(0,0,0)
2.0
sqrt(1^2+4^2)
现在,如果我们将t系统时间缩放到一定速度,则
t
t = amt = 2.0*Pi*system_time/T
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。
dt[s]
pos,vel,acc
您可以添加以下摩擦:
acc+=k*vel*|vel|; // acc += k*vel^2
其中k是在空气中的摩擦系数(在液体它会k*vel^3)比要少得多1.0。
k
k*vel^3
1.0
要驱动物体,可以使用驱动力…
acc += F/m;
这里F是驱动力的总和m是你的对象的质量。
F
m
所有这些也可以针对角度(方向)完成,因为它具有相似之处
alpha -> pos omega -> vel epsilon -> acc
并使用绝对旋转对象alpha。
alpha