Hierarchical transformations with GLM

Started by
-1 comments, last by darxus 10 years, 2 months ago

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);
		glLoadMatrixf(glm::value_ptr(matrixProj * matrixView));


		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;
}

This topic is closed to new replies.

Advertisement