View more

View more

View more

### Image of the Day Submit

IOTD | Top Screenshots

### The latest, straight to your Inbox.

Subscribe to GameDev.net Direct to receive the latest updates and exclusive content.

# Hierarchical transformations with GLM

Old topic!

Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.

No replies to this topic

### #1darxus  Members

Posted 16 February 2014 - 08:49 PM

Hello, coming from the world of C# - OpenTK, I have started C++ stuff and I find it very interesting.

Now I try to understand more about skeletal animation, having browsed lots of code here and there, I am still unable to understand exactly the concept of Skeletal Animation. I take the long road trying to implement one tutorial of my own from scratch.

Sidenote: I have looked at lots of code but it's very complex to understand. Instead of having a complex solution (say MD5Loader) I want to get some simple stuff going on in 2D. I use exclusively GLFW, GLEW, GLM, and OpenGL3, while others don't so that add more trouble.

QUESTION

This moment what I want to do, is to how get some bones moving around the screen? Specifically, I have looked at the concept of Hierarchical Transformations, but I can't figure out how to do them in GLM.

#include <iostream>
#include <GL/glew.h>
#include <GLFW/glfw3.h>
#include <glm/glm.hpp>
#include <glm/gtx/transform.hpp>
#include <glm/gtc/type_ptr.hpp>
#include <glm/gtc/matrix_transform.hpp>

using namespace std;

int main()
{
glm::vec3 positions[3];
positions[0] = glm::vec3(0, -2, 0);
positions[1] = glm::vec3(0, 1, 0); // Normally I would set this to 0
positions[2] = glm::vec3(0, 2, 0);

float rotations[3];

glm::mat4 bones[3];

// Setup window
int width = 800;
int height = 600;
glfwInit();
GLFWwindow* window;
window = glfwCreateWindow(width, height, "GLFW", NULL, NULL);
glfwMakeContextCurrent(window);

// Setup camera stuff
glm::mat4 matrixProj = glm::perspective(
45.0f, (float)width/height, 0.1f, 100.0f);

glm::mat4 matrixView = glm::lookAt(
glm::vec3(0, 0, 10), glm::vec3(0, 0, 0), glm::vec3(0, 1, 0));

while (!glfwWindowShouldClose(window))
{

glClear(GL_COLOR_BUFFER_BIT);

float sinValue = glm::sin(glfwGetTime());
float cosValue = glm::cos(glfwGetTime());

// Normal bone positions
//		bones[0] = glm::translate(positions[0]);
//		bones[1] = glm::translate(positions[1]);
//		bones[2] = glm::translate(positions[2]);

// Hierarchical bone transformations
// If bones[1] set to zero then it fails to translate, how to avoid this issue?
bones[0] = glm::translate(positions[0]);
bones[0] *= glm::translate(glm::vec3(sinValue, 0.0f, 0.0f)); // Add some movement
bones[1] = bones[0] * glm::translate(positions[1]);
bones[2] = bones[1] + glm::translate(positions[2]);

// Hierachical bone transformations with rotations
// how to perform rotation as well as translation?
//		bones[0] = glm::translate(positions[0]);
//		bones[0] *= glm::translate(glm::vec3(sinValue, 0.0f, 0.0f));
//		bones[1] = glm::rotate(bones[0], (float)sinValue, glm::vec3(0,1,0))
//			* glm::translate(positions[1]);

// Draw bones
glPointSize(1.0f);
glColor3f(1.0f, 1.0f, 1.0f);
glBegin(GL_LINE_STRIP);
for (int i = 0; i < 3; i++)
{
glm::mat4 bone = bones[i];
glVertex2f(bone[3][0], bone[3][1]);
}
glEnd();

// Draw joints
glPointSize(10.0f);
glColor3f(1.0f, 0.0f, 0.0f);
glBegin(GL_POINTS);
for (int i = 0; i < 3; i++)
{
glm::mat4 bone = bones[i];
glVertex2f(bone[3][0], bone[3][1]);
}
glEnd();

glfwSwapBuffers(window);
glfwPollEvents();
}

glfwDestroyWindow(window);
glfwTerminate();

return 0;
}



Old topic!

Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.