top of page
maxresdefault.jpg

Zombie Rollerz is a randomly generated pinball action RPG with Rogue-like elements.
僵尸弹珠是弹珠Rogue-like游戏 

(​转到Steam页面)

  • Position: Character artist, animator

  • Create 3D assets.

  • Rig and animate the assets including characters and props.

  • 职       位: 角色美术, 动画师/绑定

  • 根据原画创建角色模型并绘制贴图。

  • 绑定并根据需求创建角色动画。

Characters & Animations

render.png
throw.gif
throw_end.gif
idle_hemlet.gif
idle.gif
render.png
cast.gif
runcharge.gif
runcharge_1.gif
shell-game-dance.gif
render.png
DigIn.gif
DigOut.gif
Throw.gif
UnderShield.gif
render.png
recoil.gif
throwball.gif
throwskull.gif
render.png

Intro animations for above characters

Intro animation is the opening animation for each boss in the boss battle.
Boss的出场动画

Droid

Boss_PoisonCannon

This boss has 2 modes during the battle. 
Tank mode is the default state. The boss uses his body to stick armors and gears and compose a tank.
Ooze mode is all armors and gears were completely shot down by players, the boss with a naked body.


这个boss在战斗中有两种模式。
1 ​坦克模式,boss的默认状态,boss用身体黏住零件和大炮来组装成坦克。
2 Ooze模式,boss在战斗中被玩家击落身上的零件后的状态。

When creating the tank mode animations, the character's body and chimney need to keep shaking to simulate the tank engine started.  Every time for each clip, the animator needs to set a bunch of keyframes for several controllers to create animations, and it is hard for iterations in later work. In order to simplify the work, I created some expressions for controllers to auto-animate the chimney and armors shaking. I use the sin(X) multiply time and controller's transition and scales in the expression. For the secondary animations when it's shaking, I added some delay values in expressions for each bone.

当为坦克模式创建动画时,每个坦克模式下的动画角色身上的零件会一直抖动来模拟坦克引擎发动的状态。而创建这些动画会花大量的时间重复的给控制器设置关键帧,且为后续的修改产生大量的工作。为了减少工作复杂度,我用了表达式来简化工作量。在表达式中我将时间函数乘以控制器的位移和缩放属性,然后再乘以sin函数。并对每根子骨骼在表达式上添加了延迟系数来创建跟随的次级动画。

2
3

Expression

FKChimney_07_R.translateX = Pipe_ctl.translateX*0.2 + (1 *Pipe_ctl.bounce) * sin(2*3.1415*time*Pipe_ctl.Scale_frequency+Pipe_ctl.Scale_cache*2);

FKChimney_06_R.translateX = FKChimney_07_R.translateX*2 + (0.8 *Pipe_ctl.bounce) * sin(2*3.1415*time*Pipe_ctl.Scale_frequency+Pipe_ctl.Scale_cache*1.5);

FKChimney_05_R.translateX = FKChimney_06_R.translateX*2 + (1 *Pipe_ctl.bounce) * sin(2*3.1415*time*Pipe_ctl.Scale_frequency+Pipe_ctl.Scale_cache*1);

FKChimney_04_R.translateX = FKChimney_05_R.translateX*0.5 + (0.4 *Pipe_ctl.bounce) * sin(2*3.1415*time*Pipe_ctl.Scale_frequency+Pipe_ctl.Scale_cache*0.5);

 

FKChimney_07_R.translateY = Pipe_ctl.translateY*0.5;

FKChimney_06_R.translateY = FKChimney_07_R.translateY;

FKChimney_05_R.translateY = FKChimney_06_R.translateY;

FKChimney_04_R.translateY = FKChimney_05_R.translateY;

 

FKChimney_07_R.translateZ = Pipe_ctl.translateZ*0.5;

FKChimney_06_R.translateZ = FKChimney_07_R.translateZ;

FKChimney_05_R.translateZ = FKChimney_06_R.translateZ;

FKChimney_04_R.translateZ = FKChimney_05_R.translateZ;

 

FKChimney_07_R.rotateZ = Pipe_ctl.rotateZ*0.3;

FKChimney_06_R.rotateZ = FKChimney_07_R.rotateZ;

FKChimney_05_R.rotateZ = FKChimney_06_R.rotateZ;

FKChimney_04_R.rotateZ = FKChimney_05_R.rotateZ;

 

FKChimney_07_R.rotateY = Pipe_ctl.rotateY*0.3;

FKChimney_06_R.rotateY = FKChimney_07_R.rotateY;

FKChimney_05_R.rotateY = FKChimney_06_R.rotateY;

FKChimney_04_R.rotateY = FKChimney_05_R.rotateY;

 

FKChimney_07_R.scaleY = 1+(0.4 *Pipe_ctl.Scale_amplitude) * sin(3.1415*time*Pipe_ctl.Scale_frequency-Pipe_ctl.Scale_cache*0.8);

FKChimney_06_R.scaleY = 1+(0.3 *Pipe_ctl.Scale_amplitude) * sin(3.1415*time*Pipe_ctl.Scale_frequency-Pipe_ctl.Scale_cache*0.7);

FKChimney_05_R.scaleY = 1+(0.2 *Pipe_ctl.Scale_amplitude) * sin(3.1415*time*Pipe_ctl.Scale_frequency-Pipe_ctl.Scale_cache*0.6);

FKChimney_04_R.scaleY = 1+(0.1*Pipe_ctl.Scale_amplitude) * sin(3.1415*time*Pipe_ctl.Scale_frequency-Pipe_ctl.Scale_cache*0.5);

 

FKChimney_07_R.scaleZ = 1+(0.4 *Pipe_ctl.Scale_amplitude) * sin(3.1415*time*Pipe_ctl.Scale_frequency-Pipe_ctl.Scale_cache*0.8);

FKChimney_06_R.scaleZ = 1+(0.3 *Pipe_ctl.Scale_amplitude) * sin(3.1415*time*Pipe_ctl.Scale_frequency-Pipe_ctl.Scale_cache*0.7);

FKChimney_05_R.scaleZ = 1+(0.2 *Pipe_ctl.Scale_amplitude) * sin(3.1415*time*Pipe_ctl.Scale_frequency-Pipe_ctl.Scale_cache*0.6);

FKChimney_04_R.scaleZ = 1+(0.1*Pipe_ctl.Scale_amplitude) * sin(3.1415*time*Pipe_ctl.Scale_frequency-Pipe_ctl.Scale_cache*0.5);

 

chest_Ctl.translateY = chest_Ctl.A_translateY + (1 *ArmorVisibility_Grp|ArmorVisibility.BodyShake_Bounce) * sin(3.1415*time*ArmorVisibility_Grp|ArmorVisibility.BodyShake_frequency+ArmorVisibility_Grp|ArmorVisibility.BodyShake_Cache*1);

skirt_03_Ctl.translateY =skirt_03_Ctl.A_translateY + (0.8 *ArmorVisibility_Grp|ArmorVisibility.BodyShake_Bounce) * sin(3.1415*time*ArmorVisibility_Grp|ArmorVisibility.BodyShake_frequency+ArmorVisibility_Grp|ArmorVisibility.BodyShake_Cache*1.5);

skirt_02_Ctl.translateY =skirt_02_Ctl.A_translateY + (0.4 *ArmorVisibility_Grp|ArmorVisibility.BodyShake_Bounce) * sin(3.1415*time*ArmorVisibility_Grp|ArmorVisibility.BodyShake_frequency+ArmorVisibility_Grp|ArmorVisibility.BodyShake_Cache*2);

Boss_PoisonCannon animations

Tank mode

Intro animation

Idle

Walk

QuickShoot

PowerShoot

Summon

Assemble

Faint

Ooze mode

Grab

Faint

Recoil

  • artstationHover
  • Weibo-48
  • Gmail-48
  • LinkedIn Social Icon
  • Facebook Social Icon
bottom of page