第二章 动画

在本章中我们主要研究设置旋转角度(setRotationAngles)以及其他的一些参数。在介绍动画之前我们需要先回忆一下:
  1.     @Override
  2.     public void render(Entity entity, float var1, float var2, float var3, float var4, float var5, float var6)
  3.     {
  4.         setRotationAngles(var1, var2, var3, var4, var5, var6);
  5.         body.render(var6);
  6.     }

  7.     @Override
  8.     public void setRotationAngles(float var1, float var2, float var3, float var4, float var5, float var6)
  9.     {

  10.     }
复制代码
我们假设按照余弦函数的形式进行运动,如图所示:

其中,y(X)为在t(x)时的旋转半径。
我们使用小鸡模型 (ModelChicken) 进行举例(可以通过使用ff和mcp进行反编译得到)

  1. leg0.rotationX = MathHelper.cos(var1 * 0.6662F) * 1.4F * var2;
  2. leg1.rotationX = MathHelper.cos(var1 * 0.6662F + 3.1415927F) * 1.4F * var2;
复制代码

设置旋转角度(setRotationAngles)变量


第一自变量和第二自变量
其中第一自变量(var1)用来决定时间、第二自变量(var2)用来决定振幅。可以通过此处修改生物的移动速度,其移动速度越快,腿部的抬高幅度就越高。归纳起来,可以称第一变量为”时间变量(time)“、第二变量为”移动速度变量(walkspeed)“

以下图为例:


此时腿部绕X轴旋转满足一下公式:
y(time)=cos(time)*walkspeed
上图则描绘为一个生物处于静止状态并逐渐加速达到最大速度后逐渐减速的过程。

那么该如何进行计算呢?
参考 RenderLiving.render(Entity entity, double var2, double var4, double var6, float var8, float var9):
  1. float time = mob.field_703_S - mob.field_704_R * (1 - var6);
  2. float walkSpeed = mob.field_705_Q + (mob.field_704_R - mob.field_705_Q) * var6;
复制代码
第三自变量
确切地来说第三自变量不好进行命名,因为其根据不同文件有如下三种功能:
  • 狼:尾巴的角度
  • 墨鱼:触须的角度
  • 鸡:翅膀的角度

您只需要做的即是在渲染文件(renderfile)中修改handleRotationFloat即可。

以墨鱼为例:
  1. protected float handleRotationFloat(EntitySquid entitysquid, float f)
  2. {
  3.   //f == Timer.renderPartialTicks and represents the passed ticks since  the last rendercall (0.0 - 1.0), it gets passed down from runGameLoop() in  Minecraft.java.
  4.   return entitysquid.lastTentacleAngle + (entitysquid.tentacleAngle - entitysquid.lastTentacleAngle) * f;
  5. }
复制代码
由于lastTentacleAngle和tentacaleAngle在onLivingUpdate中设置为每秒查询20次,此时需要在两个角度中间的位置确保我们获得了一个较为流畅的动画。

第四和第五变量。
分别描述了旋转的偏转(rotationYaw)以及倾斜(RotationPitch)。
  1. float rotationYaw = entityliving.prevRotationYaw + (entityliving.rotationYaw - entityliving.prevRotationYaw) * f1;
  2. float rotationPitch = entityliving.prevRotationPitch + (entityliving.rotationPitch - entityliving.prevRotationPitch) * f1;
复制代码
在使用这连两个变量时需要对头部绕X轴的旋转(headRotationX)以及绕y轴的旋转(headRotationY)有一个明确的认识。
  1. head.rotateAngleY = f3 / 57.29578F;
  2. head.rotateAngleX = f4 / 57.29578F;
复制代码

其中57.29578为由角度制换算成弧度制的系数(180/pi)。

第六变量
该变量描述的是运动的数值范围,这一变量通常无须理会。
  1. float scale = 1 / 16.0f;
复制代码
其中1方块高度为16个像素

小结
决定旋转角度的变量有如下6个:
  • 运动动画的时间
  • 运动动画的速度
  • 那个虽然有用但不知道如何命名的变量
  • 旋转的偏转
  • 旋转的倾斜
  • 数值大小


希望这些信息能够有用~~~