Jump to content

View more

Image of the Day

雑魚は多めにして、爽快感重視にしつつ・・・(´・ω・`)
早いとこ、ベースを作って、完成にもっていかないとね。
タイトルもまだ迷ってるだよなぁ。 
#indiedev  #indiegame #screenshotsaturday https://t.co/IwVbswGrhe
IOTD | Top Screenshots

The latest, straight to your Inbox.

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


Sign up now

Hierarchical transformations with GLM

4: Adsense

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.


  • You cannot reply to this topic
No replies to this topic

#1 darxus   Members   

134
Like
0Likes
Like

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

 

 






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.