Jump to content
  • Advertisement
Sign in to follow this  
javierxd

OpenGL How to make my opengl girl dancing??

This topic is 4025 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

Hi! I'd like you to help me out... How can I make my opengl dancing??... I mean. I only have rotating her. But I'd like her also to move her hands, head and legs. Here's the source code:
#include<GL/glut.h>

GLfloat yrot;

void reshape(int width, int height)
{
     glViewport(0,0,width,height);
     glMatrixMode(GL_PROJECTION);
     glLoadIdentity();
     glOrtho(-1,1,-1,1,-1,1);
     glMatrixMode(GL_MODELVIEW);
}

void display()
{
     glClear(GL_COLOR_BUFFER_BIT);
     glLoadIdentity();
     glRotatef(yrot,0,1,0);
     //Brazo derecho
     glBegin(GL_LINES);
      glColor3f(1,0.6,0.6);
      glVertex3f(0.2,0.1,0);
      glVertex3f(0.5,0.5,0);
     glEnd();
     //Brazo izquierdo
     glBegin(GL_LINES);
      glColor3f(1,0.6,0.6);
      glVertex3f(-0.2,0.1,0);
      glVertex3f(-0.5,0.5,0);
     glEnd();
     //Piernas
     glBegin(GL_TRIANGLES);
      glColor3f(1,0.6,0.6);
      glVertex3f(-0.3,-0.5,0);
      glVertex3f(-0,-0.9,0);
      glVertex3f(0.3,-0.5,0);
     glEnd();
     //Cuerpo
     glBegin(GL_TRIANGLES);
      glColor3f(0,1,0); glVertex3f(-0.5,-0.5,0);
      glColor3f(0,1,0); glVertex3f(0.5,-0.5,0);
      glColor3f(0,0,0); glVertex3f(0,0.5,0);
    glEnd();
    glTranslatef(0.0,0.6,0.0);
    glColor3f(1,0.6,0.6);
    //Cabeza
    glBegin(GL_POLYGON);
   	glVertex3f(0.2,0.1,0.0);
      glVertex3f(0.1,0.2,0.0);
      glVertex3f(-0.1,0.2,0.0);
      glVertex3f(-0.2,0.1,0.0);
      glVertex3f(-0.2,-0.1,0.0);
      glVertex3f(-0.1,-0.2,0.0);
      glVertex3f(0.1,-0.2,0.0);
      glVertex3f(0.2,-0.1,0.0);
    glEnd();
    
    yrot += 0.05;
    
    glutSwapBuffers();
}

void init()
{
	glClearColor(0,0,0,0);
}

int main(int argc, char **argv)
{
    glutInit(&argc,argv);
    glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB);
    glutInitWindowPosition(50,50);
    glutInitWindowSize(500,500);
    glutCreateWindow("Mujer Bailando");
    init();
    glutDisplayFunc(display);
    glutReshapeFunc(reshape);
    glutIdleFunc(display);
    glutMainLoop();
    return 0;
}

I'll appreciate your help.

Share this post


Link to post
Share on other sites
Advertisement
You need to integrate some sort of animation system. Generally the model will have a skeleton; an animator will then create a set of keyframe animations for each sequence of movement. You program then blends between the two closest keyframes to get the current pose for that frame; more advanced systems will allow you to blend between several different animations.

Think of an animation like a film movie. Each frame of the film would be a separate pose in the animation sequence. You application figures out which frame you are on (or which two you are between) and draws the correct result.

The actual animation is done in a separate program which exports data for your game to read in (much like reading in a model).

-me

Share this post


Link to post
Share on other sites
I wish someone had just posted code like this back when I was learning animation.


A slightly more up to date version is on my graphics page if you want it.


// Character soft skinning with animation blending, by Jon Watte.
// Free software under the MIT license.
// Assumes some existing utility/math functions and data types.


// definitions

struct Vertex {
Vector3 pos; // in object space
Vector3 normal; // should be normalized
Vector2 texCoord;
unsigned byte indices[4]; // < numBones
float weights[4]; // should sum up to 1
};

struct Bone { // assuming bone positions relative to identity pose in world space
Vector3 offset;
Quaternion ori;
};

Vertex *iVertices, *oVertices;
int numVertices;
Matrix *boneMatrix;
Bone **animationFrames;
int numBones;
GLuint buffer;


// set-up
// load iVertices and animationFrames, numVertices and numBones
...
// allocate oVertices and boneMatrix
...
// allocate the vertex buffer object
glGenBuffers(1, &buffer);
glBindBuffer(GL_ELEMENT_ARRAY, buffer);
glBufferData(GL_ELEMENT_ARRAY, 0, 0, GL_DYNAMIC_DRAW);


// to render, based on frames A and B

// derive the pose from keyframe A and B (lerp by factor L)
for (int i = 0; i < numBones; ++i) {
boneMatrix =
Matrix::translation(animationFrames[A].offset * (1-L)
+ animationFrames.offset * L)
*
Matrix::rotation(normalize(
animationFrames[A].ori * (1-L)
+ animationFrames.ori * L));
}

// calculate the vertex position and normal based on 4-bone blending
for (int i = 0; i < numVertices; ++i) {
oVertices = iVertices;
oVertices.pos =
iVertices.pos * boneMatrix[iVertices.indices[0]] * iVertices.weights[0]
+ iVertices.pos * boneMatrix[iVertices.indices[1]] * iVertices.weights[1]
+ iVertices.pos * boneMatrix[iVertices.indices[2]] * iVertices.weights[2]
+ iVertices.pos * boneMatrix[iVertices.indices[3]] * iVertices.weights[3];
// this only works if there is no non-uniform scale in the bones
oVertices.normal =
iVertices.normal * boneMatrix[iVertices.indices[0]] * iVertices.weights[0]
+ iVertices.normal * boneMatrix[iVertices.indices[1]] * iVertices.weights[1]
+ iVertices.normal * boneMatrix[iVertices.indices[2]] * iVertices.weights[2]
+ iVertices.normal * boneMatrix[iVertices.indices[3]] * iVertices.weights[3];
}


glBindBuffer(GL_ELEMENT_ARRAY, buffer);
glBufferSubData(GL_ELEMENT_ARRAY, 0, sizeof(oVertices[0])*numVertices, oVertices);
glVertexPointer(3, GL_FLOAT, sizeof(oVertices[0]), 0);
glNormalPointer(GL_FLOAT, sizeof(oVertices[0]), 12);
glTexCoordPointer(2, GL_FLOAT, sizeof(oVertices[0]), 24);
glDrawRangeElements( /* whatever your triangle list is */ );




Have fun!

Share this post


Link to post
Share on other sites
Sign in to follow this  

  • Advertisement
×

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

We are the game development community.

Whether you are an indie, hobbyist, AAA developer, or just trying to learn, GameDev.net is the place for you to learn, share, and connect with the games industry. Learn more About Us or sign up!

Sign me up!