From b77536b7ba673d34555317bb964833257504cf99 Mon Sep 17 00:00:00 2001 From: Ian Chen Date: Fri, 25 Sep 2020 17:12:50 -0700 Subject: [PATCH 1/4] update actor animation tutorial Signed-off-by: Ian Chen --- examples/actor_animation/GlutWindow.cc | 10 +++--- examples/actor_animation/Main.cc | 14 +++++---- tutorials/10_actor_animation_tutorial.md | 38 ++++++++++++----------- tutorials/img/actor_animation.png | Bin 14408 -> 33327 bytes 4 files changed, 32 insertions(+), 30 deletions(-) diff --git a/examples/actor_animation/GlutWindow.cc b/examples/actor_animation/GlutWindow.cc index 25bae67a7..deba44082 100644 --- a/examples/actor_animation/GlutWindow.cc +++ b/examples/actor_animation/GlutWindow.cc @@ -249,6 +249,7 @@ void updatePose(double _time) // manually update the bone pose for (auto &v : g_visuals) { + //! [update pose] std::map animFrames; animFrames = g_skelAnim->PoseAt(_time, true); std::map skinFrames; @@ -257,13 +258,11 @@ void updatePose(double _time) std::string animNodeName = pair.first; auto animTf = pair.second; - //! [update pose] std::string skinName = g_skel->NodeNameAnimToSkin(g_animIdx, animNodeName); ignition::math::Matrix4d skinTf = g_skel->AlignTranslation(g_animIdx, animNodeName) * animTf * g_skel->AlignRotation(g_animIdx, animNodeName); - //! [update pose] skinFrames[skinName] = skinTf; } @@ -272,6 +271,7 @@ void updatePose(double _time) ir::MeshPtr mesh = std::dynamic_pointer_cast(v->GeometryByIndex(0)); mesh->SetSkeletonLocalTransforms(skinFrames); + //! [update pose] } } @@ -281,11 +281,13 @@ void updateTime(double _time) // set time to advance animation for (auto &v : g_visuals) { + //! [update actor] ir::MeshPtr mesh = std::dynamic_pointer_cast(v->GeometryByIndex(0)); mesh->UpdateSkeletonAnimation( std::chrono::duration_cast( std::chrono::duration(_time))); + //! [update actor] } } @@ -508,17 +510,13 @@ void initContext() ////////////////////////////////////////////////// void initAnimation() { -//! [init animation] if (!g_skel || g_skel->AnimationCount() == 0) { std::cerr << "Failed to load animation." << std::endl; return; } -//! [init animation] -//! [index animation] g_skelAnim = g_skel->Animation(g_animIdx); -//! [index animation] g_startTime = std::chrono::steady_clock::now(); } diff --git a/examples/actor_animation/Main.cc b/examples/actor_animation/Main.cc index f416b9899..378a066a4 100644 --- a/examples/actor_animation/Main.cc +++ b/examples/actor_animation/Main.cc @@ -62,15 +62,16 @@ void buildScene(ScenePtr _scene, std::vector &_visuals, // create a visual for the actor, attach mesh and get skeleton // Skeleton will be animated by GlutWindow - //! [create mesh] + //! [load mesh] ignmsg << "Creating mesh with animations..." << std::endl; MeshDescriptor descriptor; descriptor.meshName = common::joinPaths(RESOURCE_PATH, "walk.dae"); common::MeshManager *meshManager = common::MeshManager::Instance(); descriptor.mesh = meshManager->Load(descriptor.meshName); - //! [create mesh] + //! [load mesh] // add bvh animation + //! [add animation] std::string bvhFile = common::joinPaths(RESOURCE_PATH, "cmu-13_26.bvh"); double scale = 0.055; _skel = descriptor.mesh->MeshSkeleton(); @@ -83,6 +84,7 @@ void buildScene(ScenePtr _scene, std::vector &_visuals, ignmsg << "Loaded animations: " << std::endl; for (unsigned int i = 0; i < _skel->AnimationCount(); ++i) ignmsg << " * " << _skel->Animation(i)->Name() << std::endl; + //! [add animation] unsigned int size = 25; double halfSize = size * 0.5; @@ -103,18 +105,18 @@ void buildScene(ScenePtr _scene, std::vector &_visuals, actorVisual->SetLocalRotation(0, 0, 3.14); //! [create a visual for the actor] - //! [check skeleton] + //! [create mesh] auto mesh = _scene->CreateMesh(descriptor); if (!mesh) { std::cerr << "Failed to load mesh with animation." << std::endl; return; } - //! [check skeleton] - //! [added mesh] + //! [create mesh] + //! [attach mesh] actorVisual->AddGeometry(mesh); root->AddChild(actorVisual); - //! [added mesh] + //! [attach mesh] _visuals.push_back(actorVisual); } diff --git a/tutorials/10_actor_animation_tutorial.md b/tutorials/10_actor_animation_tutorial.md index 9451067dd..c75841387 100644 --- a/tutorials/10_actor_animation_tutorial.md +++ b/tutorials/10_actor_animation_tutorial.md @@ -6,38 +6,40 @@ This tutorial will show you how to use the Ignition Rendering library to create In this section we will describe the main classes and methods used to create the actor. The basic steps are: - - Create a visual for the actor - - Attach mesh - - Get skeleton - - The skeleton will be animated by `GlutWindow` + - Load the mesh with animations + - Create the actor visual + - Load the mesh in into the render engine + - Attach the mesh to the actor visual + - Animate the skeleton -Create a `Visual` pointer with the scene manager and set the position and rotation of the object: +Create a `MeshDescriptor` class with the mesh name of the actor, then using the `MeshManager` Singleton class, load the mesh and its animations using the descriptor: -\snippet examples/actor_animation/Main.cc create a visual for the actor +\snippet examples/actor_animation/Main.cc load mesh -Create a `MeshDescriptor` class with the mesh name of the actor, then using the `MeshManager` Singleton class, load the mesh in the descriptor: +The mesh is now loaded with all animations. You can also add additional animations to the mesh: -\snippet examples/actor_animation/Main.cc create mesh +\snippet examples/actor_animation/Main.cc add animation -Finally, attach the mesh to the visual: +Create a `Visual` pointer with the scene manager and set the position and rotation of the visual: -\snippet examples/actor_animation/Main.cc added mesh +\snippet examples/actor_animation/Main.cc create a visual for the actor -We can check if the mesh has a skeleton. This will allows us to check if we can animate the actor in the scene: +Create the mesh in ign-rendering - this loads the animations into the render engine + +\snippet examples/actor_animation/Main.cc create mesh -\snippet examples/actor_animation/Main.cc check skeleton +Finally, attach the mesh to the visual and add the visual to the scene: -There are two main function in the `GlutWindow.c` file: +\snippet examples/actor_animation/Main.cc attach mesh - - **void initAnimation()**: This function will check if the skeleton has an animation. Then it will load the animation using a `bvh` file (an animation file format). +There are two ways to play the animations: -\snippet examples/actor_animation/GlutWindow.cc init animation + - Update animation time: The first method is to advance the time every iteration and let the render engine handle the animations. -And finally, the animation will be initialized: +\snippet examples/actor_animation/GlutWindow.cc update actor -\snippet examples/actor_animation/GlutWindow.cc index animation + - Update bone pose: The second and more involved method is to manually compute and set the bone pose over time. - - **void updatePose()**: This function will update the skeleton over the time to create the animation of the actor. \snippet examples/actor_animation/GlutWindow.cc update pose diff --git a/tutorials/img/actor_animation.png b/tutorials/img/actor_animation.png index d4f39fe627a1d80f8f0e1a6a884aa002d83ff56a..bf292de117b98d1ceb6fa493675ebbfde925bc9f 100644 GIT binary patch literal 33327 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 literal 14408 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 Date: Fri, 25 Sep 2020 17:15:12 -0700 Subject: [PATCH 2/4] rearrange Signed-off-by: Ian Chen --- tutorials/10_actor_animation_tutorial.md | 41 ++++++++++++------------ 1 file changed, 21 insertions(+), 20 deletions(-) diff --git a/tutorials/10_actor_animation_tutorial.md b/tutorials/10_actor_animation_tutorial.md index c75841387..422b30d56 100644 --- a/tutorials/10_actor_animation_tutorial.md +++ b/tutorials/10_actor_animation_tutorial.md @@ -2,6 +2,27 @@ This tutorial will show you how to use the Ignition Rendering library to create an actor animation. +## Compile and run the example + +Clone the source code, Create a build directory and use `cmake` and `make` to compile the code: + +```{.sh} +git clone https://github.com/ignitionrobotics/ign-rendering +cd ign-rendering/examples/actor_animation +mkdir build +cd build +cmake .. +make +``` + +When the code is compiled you can execute the example with the following command. Using the left and right button of the mouse you can move around the scene and even zoom in and out. + +```{.sh} +./actor_animation +``` + +@image html img/actor_animation.png + ## Code In this section we will describe the main classes and methods used to create the actor. The basic steps are: @@ -42,23 +63,3 @@ There are two ways to play the animations: \snippet examples/actor_animation/GlutWindow.cc update pose - -## Compile and run the example - -Create a build directory and use `cmake` and `make` to compile the code: - -```{.sh} -cd ign-rendering/examples/actor_animation -mkdir build -cd build -cmake .. -make -``` - -When the code is compiled you can execute the example with the following command. Using the left and right button of the mouse you can move around the scene and even zoom in and out. - -```{.sh} -./actor_animation -``` - -@image html img/actor_animation.png From 53c40b30e21188b1926f87991b2c6fbf341fc3ef Mon Sep 17 00:00:00 2001 From: Ian Chen Date: Fri, 25 Sep 2020 17:17:25 -0700 Subject: [PATCH 3/4] minor tweak Signed-off-by: Ian Chen --- tutorials/10_actor_animation_tutorial.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tutorials/10_actor_animation_tutorial.md b/tutorials/10_actor_animation_tutorial.md index 422b30d56..cc4ef265c 100644 --- a/tutorials/10_actor_animation_tutorial.md +++ b/tutorials/10_actor_animation_tutorial.md @@ -15,7 +15,7 @@ cmake .. make ``` -When the code is compiled you can execute the example with the following command. Using the left and right button of the mouse you can move around the scene and even zoom in and out. +When the code is compiled you can execute the example with the following command. Using the left and right button of the mouse you can move around the scene and zoom in and out. ```{.sh} ./actor_animation From 29c0d458f0440cbbc7ce7ff4e1b9377321d8e977 Mon Sep 17 00:00:00 2001 From: Ian Chen Date: Fri, 25 Sep 2020 20:34:15 -0700 Subject: [PATCH 4/4] fix typo Signed-off-by: Ian Chen --- tutorials/10_actor_animation_tutorial.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tutorials/10_actor_animation_tutorial.md b/tutorials/10_actor_animation_tutorial.md index cc4ef265c..d1d1e76ed 100644 --- a/tutorials/10_actor_animation_tutorial.md +++ b/tutorials/10_actor_animation_tutorial.md @@ -29,7 +29,7 @@ In this section we will describe the main classes and methods used to create the - Load the mesh with animations - Create the actor visual - - Load the mesh in into the render engine + - Load the mesh into the render engine - Attach the mesh to the actor visual - Animate the skeleton