summaryrefslogtreecommitdiffhomepage
path: root/examples
diff options
context:
space:
mode:
authorhristo <[email protected]>2021-01-28 12:29:06 +0200
committerGitHub <[email protected]>2021-01-28 11:29:06 +0100
commit731ab15d5768340bcfb028878fb3d92ae49ec1ab (patch)
tree533190c7cb95210d7c62426c63c3263a4a8b2aca /examples
parent88a6f16c9a552ebb8c39fff57cf16cfce7c88913 (diff)
downloadraylib-731ab15d5768340bcfb028878fb3d92ae49ec1ab.tar.gz
raylib-731ab15d5768340bcfb028878fb3d92ae49ec1ab.zip
Gltf animation support (#1551)
* Added example for gltf animation and split some functions for loading model animations into IQM and GLTF similar to how models are being loaded. * Removed wrongly duplicated function * Bone loading for gltf model (not working at this point) * Loading info about vertex to joint connection but animation is still not working * Skeleton and pose is correctly loaded. Need to communicate about interpolation in GLTF * The model almost looks like a real person on animation. * Fixed model loading with bones. Also updated license info on the model. * Cleaned up some code and updated examples. * Fix identation issues * Fix identation issues * Fix identation issues
Diffstat (limited to 'examples')
-rw-r--r--examples/models/models_gltf_animation.c115
-rw-r--r--examples/models/models_gltf_model.c87
-rw-r--r--examples/models/resources/gltf/Avocado.glbbin0 -> 8328156 bytes
-rw-r--r--examples/models/resources/gltf/LICENSE11
-rw-r--r--examples/models/resources/gltf/rigged_figure.glbbin0 -> 50116 bytes
5 files changed, 213 insertions, 0 deletions
diff --git a/examples/models/models_gltf_animation.c b/examples/models/models_gltf_animation.c
new file mode 100644
index 00000000..e3120500
--- /dev/null
+++ b/examples/models/models_gltf_animation.c
@@ -0,0 +1,115 @@
+/*******************************************************************************************
+*
+* raylib [models] example - Load 3d gltf model with animations and play them
+*
+* This example has been created using raylib 3.5 (www.raylib.com)
+* raylib is licensed under an unmodified zlib/libpng license (View raylib.h for details)
+*
+* Example contributed by Hristo Stamenov (@object71) and reviewed by Ramon Santamaria (@raysan5)
+*
+* Copyright (c) 2021 Hristo Stamenov (@object71) and Ramon Santamaria (@raysan5)
+*
+********************************************************************************************
+*
+* To export a model from blender, make sure it is not posed, the vertices need to be in the
+* same position as they would be in edit mode.
+* and that the scale of your models is set to 0. Scaling can be done from the export menu.
+*
+********************************************************************************************/
+
+#include "raylib.h"
+
+#include <stdlib.h>
+
+
+int main(void)
+{
+ // Initialization
+ //--------------------------------------------------------------------------------------
+ const int screenWidth = 800;
+ const int screenHeight = 450;
+
+ InitWindow(screenWidth, screenHeight, "raylib [models] example - model animation");
+
+ // Define the camera to look into our 3d world
+ Camera camera = { 0 };
+ camera.position = (Vector3){ 10.0f, 10.0f, 10.0f }; // Camera position
+ camera.target = (Vector3){ 0.0f, 0.0f, 0.0f }; // Camera looking at point
+ camera.up = (Vector3){ 0.0f, 1.0f, 0.0f }; // Camera up vector (rotation towards target)
+ camera.fovy = 45.0f; // Camera field-of-view Y
+ camera.type = CAMERA_PERSPECTIVE; // Camera mode type
+
+ Model model = LoadModel("resources/gltf/rigged_figure.glb"); // Load the animated model mesh and
+ // basic data
+// Texture2D texture = LoadTexture("resources/guy/guytex.png"); // Load model texture and set material
+// SetMaterialTexture(&model.materials[0], MAP_DIFFUSE, texture); // Set model material map texture
+
+ Vector3 position = { 0.0f, 0.0f, 0.0f }; // Set model position
+
+ // Load animation data
+ int animsCount = 0;
+ ModelAnimation *anims = LoadModelAnimations("resources/gltf/rigged_figure.glb", &animsCount);
+ int animFrameCounter = 0;
+
+ SetCameraMode(camera, CAMERA_FREE); // Set free camera mode
+
+ SetTargetFPS(60); // Set our game to run at 60 frames-per-second
+ //--------------------------------------------------------------------------------------
+
+ // Main game loop
+ while (!WindowShouldClose()) // Detect window close button or ESC key
+ {
+ // Update
+ //----------------------------------------------------------------------------------
+ UpdateCamera(&camera);
+
+ // Play animation when spacebar is held down
+ if (IsKeyDown(KEY_SPACE))
+ {
+ animFrameCounter++;
+ UpdateModelAnimation(model, anims[0], animFrameCounter);
+ if (animFrameCounter >= anims[0].frameCount) animFrameCounter = 0;
+ }
+ //----------------------------------------------------------------------------------
+
+ // Draw
+ //----------------------------------------------------------------------------------
+ BeginDrawing();
+
+ ClearBackground(RAYWHITE);
+
+ BeginMode3D(camera);
+
+ DrawModelEx(model, position, (Vector3){ 1.0f, 0.0f, 0.0f }, -90.0f, (Vector3){ 1.0f, 1.0f, 1.0f }, WHITE);
+
+ for (int i = 0; i < model.boneCount; i++)
+ {
+ DrawSphere(anims[0].framePoses[animFrameCounter][i].translation, 0.01f, RED);
+ }
+
+ DrawGrid(10, 1.0f); // Draw a grid
+
+ EndMode3D();
+
+ DrawText("PRESS SPACE to PLAY MODEL ANIMATION", 10, 10, 20, MAROON);
+ DrawText("(cc4) Rigged Figure by @Cesium", screenWidth - 200, screenHeight - 20, 10, GRAY);
+
+ EndDrawing();
+ //----------------------------------------------------------------------------------
+ }
+
+ // De-Initialization
+ //--------------------------------------------------------------------------------------
+// UnloadTexture(texture); // Unload texture
+
+ // Unload model animations data
+ for (int i = 0; i < animsCount; i++) UnloadModelAnimation(anims[i]);
+ RL_FREE(anims);
+
+ UnloadModel(model); // Unload model
+
+ CloseWindow(); // Close window and OpenGL context
+ //--------------------------------------------------------------------------------------
+
+ return 0;
+}
diff --git a/examples/models/models_gltf_model.c b/examples/models/models_gltf_model.c
new file mode 100644
index 00000000..c064e34f
--- /dev/null
+++ b/examples/models/models_gltf_model.c
@@ -0,0 +1,87 @@
+/*******************************************************************************************
+*
+* raylib [models] example - Load 3d gltf model
+*
+* This example has been created using raylib 3.5 (www.raylib.com)
+* raylib is licensed under an unmodified zlib/libpng license (View raylib.h for details)
+*
+* Example contributed by Hristo Stamenov (@object71) and reviewed by Ramon Santamaria (@raysan5)
+*
+* Copyright (c) 2021 Hristo Stamenov (@object71) and Ramon Santamaria (@raysan5)
+*
+********************************************************************************************
+*
+* To export a model from blender, make sure it is not posed, the vertices need to be in the
+* same position as they would be in edit mode.
+* and that the scale of your models is set to 0. Scaling can be done from the export menu.
+*
+********************************************************************************************/
+
+#include "raylib.h"
+
+#include <stdlib.h>
+
+
+int main(void)
+{
+ // Initialization
+ //--------------------------------------------------------------------------------------
+ const int screenWidth = 800;
+ const int screenHeight = 450;
+
+ InitWindow(screenWidth, screenHeight, "raylib [models] example - model animation");
+
+ // Define the camera to look into our 3d world
+ Camera camera = { 0 };
+ camera.position = (Vector3){ 10.0f, 10.0f, 10.0f }; // Camera position
+ camera.target = (Vector3){ 0.0f, 0.0f, 0.0f }; // Camera looking at point
+ camera.up = (Vector3){ 0.0f, 1.0f, 0.0f }; // Camera up vector (rotation towards target)
+ camera.fovy = 45.0f; // Camera field-of-view Y
+ camera.type = CAMERA_PERSPECTIVE; // Camera mode type
+
+ Model model = LoadModel("resources/gltf/Avocado.glb"); // Load the animated model mesh and
+
+ Vector3 position = { 0.0f, 0.0f, 0.0f }; // Set model position
+
+ SetCameraMode(camera, CAMERA_FREE); // Set free camera mode
+
+ SetTargetFPS(60); // Set our game to run at 60 frames-per-second
+ //--------------------------------------------------------------------------------------
+
+ // Main game loop
+ while (!WindowShouldClose()) // Detect window close button or ESC key
+ {
+ // Update
+ //----------------------------------------------------------------------------------
+ UpdateCamera(&camera);
+
+ // Draw
+ //----------------------------------------------------------------------------------
+ BeginDrawing();
+
+ ClearBackground(RAYWHITE);
+
+ BeginMode3D(camera);
+
+ DrawModelEx(model, position, (Vector3){ 0.0f, 1.0f, 0.0f }, 180.0f, (Vector3){ 15.0f, 15.0f, 15.0f }, WHITE);
+
+ DrawGrid(10, 1.0f); // Draw a grid
+
+ EndMode3D();
+
+ DrawText("(cc0) Avocado by @Microsoft", screenWidth - 200, screenHeight - 20, 10, GRAY);
+
+ EndDrawing();
+ //----------------------------------------------------------------------------------
+ }
+
+ // De-Initialization
+ //--------------------------------------------------------------------------------------
+
+ UnloadModel(model); // Unload model
+
+ CloseWindow(); // Close window and OpenGL context
+ //--------------------------------------------------------------------------------------
+
+ return 0;
+}
diff --git a/examples/models/resources/gltf/Avocado.glb b/examples/models/resources/gltf/Avocado.glb
new file mode 100644
index 00000000..006b79c3
--- /dev/null
+++ b/examples/models/resources/gltf/Avocado.glb
Binary files differ
diff --git a/examples/models/resources/gltf/LICENSE b/examples/models/resources/gltf/LICENSE
new file mode 100644
index 00000000..77c73c62
--- /dev/null
+++ b/examples/models/resources/gltf/LICENSE
@@ -0,0 +1,11 @@
+Rigged Figure model has been created by Cesium (https://cesium.com/cesiumjs/),
+and licensed as Creative Commons Attribution 4.0 International License.
+
+Check for details: http://creativecommons.org/licenses/by/4.0/
+
+Avocado model is provided by Microsoft
+and licensed as CC0 Universal Public Domain
+
+Check for details: https://creativecommons.org/publicdomain/zero/1.0/
+
+GLTF sample models for testing are taken from: https://github.com/KhronosGroup/glTF-Sample-Models/
diff --git a/examples/models/resources/gltf/rigged_figure.glb b/examples/models/resources/gltf/rigged_figure.glb
new file mode 100644
index 00000000..c505a33d
--- /dev/null
+++ b/examples/models/resources/gltf/rigged_figure.glb
Binary files differ