Minecraft(我的世界)中文论坛

标题: [tech基础教程]part2

作者: DJXGAME    时间: 2012-7-29 12:06
标题: [tech基础教程]part2

第二章 动画

在本章中我们主要研究设置旋转角度(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个:


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




作者: 木是伊    时间: 2012-7-29 12:07
支持一下OAO
作者: craft    时间: 2012-7-29 12:12
感谢。非常有用的教程。
作者: 公猫    时间: 2012-8-24 17:17
给力啊情。
作者: mika880829    时间: 2013-8-29 23:50
lz太好人了!!!
翻譯了這麼棒的教學!
作者: 星辰月夜    时间: 2013-10-17 19:56
好像挺不错,谢谢楼主
作者: jiawen123    时间: 2014-2-23 19:06
好像好难。。。
作者: 幽蓝    时间: 2014-2-25 23:28
呃,有金粒拿~肯定带走啊
作者: 幽蓝    时间: 2014-2-25 23:30
看看还有木有~
作者: 我是M哥    时间: 2014-9-29 19:56
呃。没看懂
作者: 特首何厚铧    时间: 2015-1-26 15:48
感谢分享!真有用
作者: 末影龙娘    时间: 2015-1-26 16:48
首次见到Tech的教程,看起来很高深哈
作者: qw78qwe    时间: 2016-1-17 02:36
谢谢楼主。。认真学习中0.0

作者: grady栗    时间: 2016-2-29 15:32
图挂了啊。。。。
作者: grady栗    时间: 2016-2-29 15:37
  这里的 setRotationAngles(float var1, float var2, float var3, float var4, float var5, float var6)这6个参数是代表什么?

@Override
    public void render(Entity entity, float var1, float var2, float var3, float var4, float var5, float var6)
    {
        setRotationAngles(var1, var2, var3, var4, var5, var6);
        body.render(var6);
    }

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

    }
作者: grady栗    时间: 2016-2-29 15:39
grady栗 发表于 2016-2-29 15:37
这里的 setRotationAngles(float var1, float var2, float var3, float var4, float var5, float var6)这 ...

而且为什么函数体是空白的??