这个方程并不神秘……它只是一个椭圆(扭曲的圆)的参数方程……让我通过它的推导来解释一下:
-
2D xy 平面圆:
x=x0+r*cos(t)
y=y0+r*sin(t)
where (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
) and x,y
轴是前者的旋转部分y
轴。椭圆的中心是(0,0,0)
并且有半轴2.0
and sqrt(1^2+4^2)
.
现在如果我们改变t
然后系统时间缩放到某个速度
t = amt = 2.0*Pi*system_time/T
Where T
是你的运动期。
现在,当您使用绝对平移时,您可以将对象移动到沿椭圆的位置。如果使用相对平移,则速度由该椭圆驱动,从而产生更复杂的轨迹。如果您想要真正的物理用途,这只是假运动模拟牛顿·达朗贝尔物理学并通过改变加速度来驱动你的物体。
如果您想制作人类驱动的对象,请查看此处的最后一个链接:
对于行星运动,请参见:
- 是否有可能在尺寸和质量方面进行真实的 n 体太阳系模拟?
所以要回答你的第二个问题,请使用牛顿·达朗贝尔 and 矢量数学。我假设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
where dt [s]
是自上次计算以来经过的时间,因此对于计时器来说,它是其间隔(以秒为单位)。您可以使用任何单位,但所有单位必须兼容pos,vel,acc
.
您可以添加摩擦力,例如:
acc+=k*vel*|vel|; // acc += k*vel^2
where k
是空气中的摩擦系数(在液体中则为k*vel^3
)远小于1.0
.
为了驱动你的物体,你可以使用驱动力......
acc += F/m;
where F
是驱动力的总和,m
是物体的质量。
所有这些也可以用于角度(方向),因为它有相似之处
alpha -> pos
omega -> vel
epsilon -> acc
并使用对象的绝对旋转alpha
.