这个方程并不神秘......它只是一个椭圆的参数方程(扭曲的圆)......让我解释一下它的推导:
-
2D xy 平面圆:
x=x0+r*cos(t)
y=y0+r*sin(t)
其中(x0,y0) 是圆心,r 是圆半径,t=<0.0,2.0*Pi> 是角度参数,用于确定您想要的圆的哪个点。
-
2D xy 平面轴对齐椭圆
x=x0+rx*cos(t)
y=y0+ry*sin(t)
我们只是在每个轴上使用不同的半径。所以rx,ry也是半轴。
-
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 使用对象的绝对旋转。