A comunidade brasileira de desenvolvimento e programação de jogos.
Bem-vindo: Ter Out 27, 2020 3:25 pm

Todos os horários são GMT - 3 horas




Criar novo tópico Responder  [ 5 mensagens ] 
Autor Mensagem
 Título: [RESOLVIDO] Desenho parece travar em movimento.
MensagemEnviado: Seg Out 05, 2009 5:53 pm 
Offline
Membro novo

Registrado em: Seg Out 05, 2009 5:45 pm
Mensagens: 4
Estou tentando aprender OpenGl. Estou tentando fazer um aplicativo simples no qual um boneco deveria andar para frente.

Comecei a fazer uns testes. construir coisas basicas. bem simples mesmo.
mas foi ai então q eu travei em um ponto.
Eu estava criando um movimento para as pernas para cada tecla.
o botao D fazia a perna direita subir. o botao E fazia a perna direita descer. o botao S fazia a perna esquerda subir e a o botao W fazia a perna esquerda descer.

dai eu percebi q qdo a perna alcança o angulo de 45° ela para! ela trava. não desce mais! gostaria se saber se alguem sabe como me ajudar.
aonde q eu estou errando.

ai vai o codigoa ate agora.

#include <stdlib.h>
#include <stdio.h>

#include <GL/glut.h>

static int slices = 16;
static int stacks = 16;

float posPernaDireita = 0, anguloPernaDireita = 90, countPernaDireita;
float posPernaEsquerda = 0, anguloPernaEsquerda = 90, countPernaEsquerda;
float posPeDireitoX = -0.5, posPeDireitoY = -1, posPeDireitoZ = -6, anguloPeDireito = 0, countPeDireito;
float posPeEsquerdoX = 0.5, posPeEsquerdoY = -1,posPeEsquerdoZ = -6, anguloPeEsquerdo = 0, countPeEsquerdo;
float posBracoDireito = 0, anguloBracoDireito = 0, countBracoDireito;
float posBracoEsquerdo = 0, anguloBracoEsquerdo = 0, countBracoEsquerdo;
float posCorpo = 0, anguloCorpo = 0, countCorpo;
float posCabeca = 0, anguloCabeca = 0, countCabeca;

GLUquadricObj *pernaDireita;
GLUquadricObj *pernaEsquerda;
GLUquadricObj *bracoDireito;
GLUquadricObj *bracoEsquerdo;

/* GLUT callback Handlers */

static void resize(int width, int height)
{
const float ar = (float) width / (float) height;

pernaDireita = gluNewQuadric();
pernaEsquerda = gluNewQuadric();
bracoDireito = gluNewQuadric();
bracoEsquerdo = gluNewQuadric();

glViewport(0, 0, width, height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glFrustum(-ar, ar, -1.0, 1.0, 2.0, 100.0);

glMatrixMode(GL_MODELVIEW);
glLoadIdentity() ;
}

static void display(void)
{
const double t = glutGet(GLUT_ELAPSED_TIME) / 1000.0;
const double a = t*90.0;

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
glColor3d(1,0,0);

//gluPerspective(3,1,-5,100);
//gluLookAt( 5,5,-5, 0,0,0, 0,0,0);

/* *DEFINIÇÃO INICIAL DO CORPO DO BONECO */


/* *Cabeca do Boneco *
glPushMatrix();
glTranslatef(0.5,2,-6);
glScalef(0.65,0.65,1);
glutSolidSphere(1,slices,stacks);
glPopMatrix();

/* *Corpo do Boneco *
glTranslatef(0.5,0.8,-6);
glutSolidSphere(1,slices,stacks);
glPopMatrix();

*/

/* *Perna DIREITA do boneco */
glPushMatrix();
glTranslatef(-0.5,0,-6.3);
glRotatef(anguloPernaDireita,1,0,0);
gluCylinder( pernaDireita, 0.2, 0.2, 1, slices, stacks);
glPopMatrix();

/* *Perna ESQUERDA do boneco */
glPushMatrix();
glTranslatef(0.5,0,-6.3);
glRotatef(anguloPernaEsquerda,1,0,0);
gluCylinder( pernaEsquerda, 0.2, 0.2, 1, slices, stacks);
glPopMatrix();

/* *Pe DIREITO do Boneco */
glPushMatrix();
glTranslatef(posPeDireitoX,posPeDireitoY,posPeDireitoZ);
glScalef(1,0.4,1.5);
glRotatef(anguloPeDireito,1,0,0);
glutSolidCube(0.4);
glPopMatrix();

/* *Pe ESQUERDO do Boneco */
glPushMatrix();
glTranslatef(posPeEsquerdoX,posPeEsquerdoY,posPeEsquerdoZ);
glScalef(1,0.4,1.5);
glRotatef(anguloPeEsquerdo,1,0,0);
glutSolidCube(0.4);
glPopMatrix();

glutSwapBuffers();
}

static void key(unsigned char key, int x, int y)
{
switch (key)
{
case 'q':
exit(0);
break;

case 'd':
if( anguloPernaDireita >= 45 && anguloPernaDireita <= 90 )
{
anguloPernaDireita -= 5;
if( anguloPeDireito <= 0 && anguloPeDireito >= -45 )
{
anguloPeDireito -= 5;
posPeDireitoY += 0.05;
posPeDireitoZ += 0.1;
}
}
break;

case 'e':
if( anguloPernaDireita >= 45 && anguloPernaDireita < 90 )
{
anguloPernaDireita += 5;
if( anguloPeDireito <= 0 && anguloPeDireito >= -45 )
{
anguloPeDireito += 5;
posPeDireitoY -= 0.05;
posPeDireitoZ -= 0.1;
}
}
break;

case 's':
if( anguloPernaEsquerda >= 45 && anguloPernaEsquerda <= 90 )
{
anguloPernaEsquerda -= 5;
if( anguloPeEsquerdo <= 0 && anguloPeEsquerdo >= -45 )
{
anguloPeEsquerdo -= 5;
posPeEsquerdoY += 0.05;
posPeEsquerdoZ += 0.1;
}
}
break;

case 'w':
if( anguloPernaEsquerda >= 45 && anguloPernaEsquerda < 90 )
{
anguloPernaEsquerda += 5;
if( anguloPeEsquerdo <= 0 && anguloPeEsquerdo >= -45 )
{
anguloPeEsquerdo += 5;
posPeEsquerdoY -= 0.05;
posPeEsquerdoZ -= 0.1;
}
}
break;
}

glutPostRedisplay();
}



static void idle(void)
{
glutPostRedisplay();
}

void mouse(int button, int state, int x, int y)
{
//if (button == GLUT_LEFT_BUTTON && state == GLUT_DOWN) {

}

const GLfloat light_ambient[] = { 0.0f, 0.0f, 0.0f, 1.0f };
const GLfloat light_diffuse[] = { 1.0f, 1.0f, 1.0f, 1.0f };
const GLfloat light_specular[] = { 1.0f, 1.0f, 1.0f, 1.0f };
const GLfloat light_position[] = { 2.0f, 5.0f, 5.0f, 0.0f };

const GLfloat mat_ambient[] = { 0.7f, 0.7f, 0.7f, 1.0f };
const GLfloat mat_diffuse[] = { 0.8f, 0.8f, 0.8f, 1.0f };
const GLfloat mat_specular[] = { 1.0f, 1.0f, 1.0f, 1.0f };
const GLfloat high_shininess[] = { 100.0f };

/* Program entry point */

int main(int argc, char *argv[])
{
glutInit(&argc, argv);
glutInitWindowSize(800,600);
glutInitWindowPosition(150,150);
glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);

glutCreateWindow("Animacao");

glutSetKeyRepeat(GLUT_KEY_REPEAT_ON);
glutReshapeFunc(resize);
glutDisplayFunc(display);
glutKeyboardFunc(key);
// glutMouseFunc(mouse);
glutIdleFunc(idle);

glClearColor(1,1,1,1);
glEnable(GL_CULL_FACE);
glCullFace(GL_BACK);

glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LESS);

glEnable(GL_LIGHT0);
glEnable(GL_NORMALIZE);
glEnable(GL_COLOR_MATERIAL);
glEnable(GL_LIGHTING);

glLightfv(GL_LIGHT0, GL_AMBIENT, light_ambient);
glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse);
glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular);
glLightfv(GL_LIGHT0, GL_POSITION, light_position);

glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient);
glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);
glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
glMaterialfv(GL_FRONT, GL_SHININESS, high_shininess);

glutMainLoop();

return EXIT_SUCCESS;
}





espero por respostas.
e desculpa se o erro for mto banal. mas estou começando agora.


Editado pela última vez por saulokada em Ter Out 06, 2009 5:00 pm, em um total de 1 vez.

Voltar ao topo
 Perfil  
 
 Título:
MensagemEnviado: Seg Out 05, 2009 7:10 pm 
Offline
Membro avançado

Registrado em: Seg Dez 24, 2007 2:09 am
Mensagens: 239
Localização: Em algum byte perdido na memória...
faz uma funcao pro personagem fazer um alongamento nas pernas, talvez depois do alongamento a perna dobre mais um poco, uhasuhasuhsausau, brincadeira.

o problema esta relacionado a esta parte do codigo

Código:
if( anguloPernaDireita >= 45 && anguloPernaDireita < 90 )


ai esta limitado o angulo da perna.


Voltar ao topo
 Perfil  
 
 Título:
MensagemEnviado: Seg Out 05, 2009 7:48 pm 
Offline
Membro novo

Registrado em: Seg Out 05, 2009 5:45 pm
Mensagens: 4
so para saber...
entao o q eu deveria colocar no lugar desse if?


Voltar ao topo
 Perfil  
 
 Título:
MensagemEnviado: Seg Out 05, 2009 9:32 pm 
Offline
Membro veterano
Avatar do usuário

Registrado em: Dom Mai 20, 2007 8:42 am
Mensagens: 1114
Localização: Belo Horizonte
O que está implicando no erro e que na hora da decrementação do angulo das pernas ele está ultrapassando 45º....

Código:
if( anguloPernaDireita >= 45 && anguloPernaDireita <= 90 )
{
anguloPernaDireita -= 5;

//Como a condição e de que se a perna for maior ou igual a 45º. Quando ela atingir 45º ela ainda vai realizar mais uma decrementação... oque vai fazer com que o angulo fique em 40º e não consiga incrementar novamente.

A condição de angulação deve ficar diferente dependendo se for incrementar ou decrementar. para que não acabe ultrapassando o valor que permite o retorno da animação.

A condição ficaria dessa forma:
Código:
if( anguloPerna >= 45 && anguloPerna < 90 )
//Para Incrementar
if( anguloPerna > 45 && anguloPerna <= 90 )
//Para Decrementar


Este metodo você deve implementar tanto na perna esquerda quanto na direita.

Switch de movimento corrigido:
Código:
case 'd':
if( anguloPernaDireita > 45 && anguloPernaDireita <= 90 )
{
anguloPernaDireita -= 5;
if( anguloPeDireito <= 0 && anguloPeDireito > -45 )
{
anguloPeDireito -= 5;
posPeDireitoY += 0.05;
posPeDireitoZ += 0.1;
}
}
break;

case 'e':
if( anguloPernaDireita >= 45 && anguloPernaDireita < 90 )
{
anguloPernaDireita += 5;
if( anguloPeDireito < 0 && anguloPeDireito >= -45 )
{
anguloPeDireito += 5;
posPeDireitoY -= 0.05;
posPeDireitoZ -= 0.1;
}
}
break;

case 's':
if( anguloPernaEsquerda > 45 && anguloPernaEsquerda <= 90 )
{
anguloPernaEsquerda -= 5;
if( anguloPeEsquerdo <= 0 && anguloPeEsquerdo > -45 )
{
anguloPeEsquerdo -= 5;
posPeEsquerdoY += 0.05;
posPeEsquerdoZ += 0.1;
}
}
break;

case 'w':
if( anguloPernaEsquerda >= 45 && anguloPernaEsquerda < 90 )
{
anguloPernaEsquerda += 5;
if( anguloPeEsquerdo < 0 && anguloPeEsquerdo >= -45 )
{
anguloPeEsquerdo += 5;
posPeEsquerdoY -= 0.05;
posPeEsquerdoZ -= 0.1;
}
}
break;
}


Flw Abraço!

_________________
Imagem


Voltar ao topo
 Perfil  
 
 Título: Mto Obrigado Pela Ajuda!
MensagemEnviado: Ter Out 06, 2009 2:38 pm 
Offline
Membro novo

Registrado em: Seg Out 05, 2009 5:45 pm
Mensagens: 4
Deu certinho!
agora vou poder completar o meu boneco palito! haU hauahuahuAHa
abraçosss!!!


Voltar ao topo
 Perfil  
 
Exibir mensagens anteriores:  Ordenar por  
Criar novo tópico Responder  [ 5 mensagens ] 

Todos os horários são GMT - 3 horas


Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante


Enviar mensagens: Proibido
Responder mensagens: Proibido
Editar mensagens: Proibido
Excluir mensagens: Proibido
Enviar anexos: Proibido

Ir para:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Traduzido por: Suporte phpBB