-
-
Notifications
You must be signed in to change notification settings - Fork 158
Molang
Molang is a simple but powerful expression-based language that can create very complex and powerful animations. It has a learning curve, but once you master it it becomes a very useful tool in your animation toolset.
Molang allows you to type math expressions into keyframe values instead of just numbers. For example, you could type 5 * 4 into a scale keyframe, and it would evaluate to 20. You can also do much more complex things using math functions like math.sin, math.cos, and math.abs. Read about all the math functions on the Bedrock Wiki.
GeckoLib 3.0.0 supports Molang, and has several useful queries.
query.anim_timequery.actor_countquery.time_of_dayquery.moon_phasequery.distance_from_cameraquery.is_on_groundquery.is_in_waterquery.is_in_water_or_rainquery.healthquery.max_healthquery.is_on_firequery.on_fire_timequery.ground_speedquery.yaw_speed
Horizontal sine
In this example, the 200 is used as a modifier for the speed of the cube, and the 10 is used to control how far it moves.
Position:
- X:
0 - Y:
0 - Z:
math.sin(query.anim_time * 200) * 10
{:width=350}
Circle
Position:
- X:
0 - Y:
math.cos(query.anim_time * 200) * 10 - Z:
math.sin(query.anim_time * 200) * 10
{:width=350}
Bouncy Cube
Position:
- X:
0 - Y:
math.abs(math.sin(query.anim_time * 500) * math.exp(-0.5 * query.anim_time)) * 10 - Z:
0
{:width=350}
Crystal
Rotation:
- X:
math.sin(query.anim_time * 100) * 150 - Y:
math.cos(query.anim_time * 100) * 150 - Z:
math.sin(query.anim_time * 100) * 150
{:width=350}
Arc
Position:
To arc a bone between two points, see this article
In this example, the bone is moving between from (-10, 0) to (10, 0) and uses (0, 15) as it's height control point. It will never reach (0, 15).
- X:
Math.lerp(-10, 10, query.anim_time) - Y:
Math.lerp(Math.lerp(0, temp.control_height, query.anim_time), Math.lerp(temp.control_height, 0, query.anim_time), query.anim_time) - Z:
0
Preview Variables:
temp.control_height = 50;
{:width=350}
Human Idle
Left Arm:
- X:
Math.cos(query.anim_time * 150 +75) * -15 - Y:
0 - Z:
0
Right Arm (Rotation):
- X:
Math.cos(query.anim_time * 150 +25) * 15 - Y:
0 - Z:
0
Body (Position):
- X:
0 - Y:
Math.cos(query.anim_time * 100) * 0.5 -0.5 - Z:
0
Head (Rotation):
- X:
Math.cos(query.anim_time * 100 -50) * -5 - Y:
0 - Z:
0
{:width=350}
Try out this model here!
Controlling Animation Speed
Position:
To control the speed of an animation, define your own variable. In this example, we'll name it anim_speed. Then, either set it to a predefined value, like 2. Then in code you can set this value using GeckoLibCache.getInstance().parser.setValue("anim_speed", 2); Simply set this in your renderer, and it will get updated every frame before being animated. In this example, the anim_speed variable is updated dynamically to match the query.anim_time field, effectively making the animation speed up over time.
- X:
Math.lerp(-30, 30, query.anim_time * anim_speed) - Y:
Math.lerp(Math.lerp(0, temp.control_height, query.anim_time * anim_speed), Math.lerp(temp.control_height, 0, query.anim_time * anim_speed), query.anim_time * anim_speed) - Z:
0
Preview Variables:
temp.control_height = 80;
anim_speed = query.anim_time / 2;
{:width=350}
Read about what all these queries do on the wiki.
If GeckoLib is missing a query that you need, ask us in the discord.
Geckolib 3
Geckolib 4
- Installation
- Getting Started
- Upgrading from GeckoLib 3.1.x to 4.0
- Updating to GeckoLib 4.5
- Basic
- Advanced
- Miscellaneous
Geckolib 5
See the New Wiki!
Package repository hosting is graciously provided by Cloudsmith.
Cloudsmith is the only fully hosted, cloud-native, universal package management solution that enables your organization to create, store and share packages in any format, to any place, with total confidence.