Moderador: Dokan
#include <iostream>
#include <SDL/SDL.h>
#include <GL/gl.h>
#include <cmath>
using namespace std;
#define SCREEN_S_W 640
#define SCREEN_S_H 640
#define CLIP_REGION_W 100
#define CLIP_REGION_H 100
float tcos3f(float l1, float a, float l2) {
return acos((l1*l1-a*a+l2*l2)/(2*l1*l2));
}
float hip(float c1, float c2) {
return sqrt(c1*c1+c2*c2);
}
float deg(float a) {
return a*360/(2*M_PI);
}
void initGL() {
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
glShadeModel(GL_SMOOTH);
glClearColor( 1.0f, 1.0f, 1.0f, 0.0f );
glEnable( GL_DEPTH_TEST );
glPointSize(8);
glLineWidth(4);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0.0f, CLIP_REGION_W, 0.0f, CLIP_REGION_H, -10.0f, 10.0f);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
struct Hueso {
float dist, angulo;
};
class Brazo2GL {
public:
Brazo2GL();
void mover_a(float x, float y, float tiempo);
void update(float tiempo);
void draw();
private:
Hueso m_brazo, m_antebrazo;
float m_px, m_py;
float m_x, m_y, m_x0, m_y0, m_xF, m_yF;
float m_tiempo, m_tiempoF;
};
Brazo2GL::Brazo2GL() {
m_px = m_py = 40;
m_brazo.dist = 40;
m_antebrazo.dist = 25;
m_xF = 80;
m_yF = 70;
m_tiempo = m_tiempoF = 1;
}
void Brazo2GL::mover_a(float x, float y, float tiempo) {
m_tiempo = 0;
m_tiempoF = tiempo;
m_x0 = m_x;
m_y0 = m_y;
m_xF = x;
m_yF = y;
}
void Brazo2GL::update(float tiempo) {
m_tiempo += tiempo;
if (m_tiempo >= m_tiempoF) m_tiempo = m_tiempoF;
m_x = m_x0 + (m_xF-m_x0)*(m_tiempo/m_tiempoF);
m_y = m_y0 + (m_yF-m_y0)*(m_tiempo/m_tiempoF);
float alpha = atan2(m_y-m_py, m_x-m_px);
float lado = hip(m_x-m_px, m_y-m_py);
if (lado < (m_brazo.dist - m_antebrazo.dist))
lado = (m_brazo.dist - m_antebrazo.dist);
if (lado > (m_brazo.dist + m_antebrazo.dist))
lado = (m_brazo.dist + m_antebrazo.dist);
m_brazo.angulo = tcos3f(
lado,
m_antebrazo.dist,
m_brazo.dist
) + alpha;
m_antebrazo.angulo = tcos3f(
m_antebrazo.dist,
lado,
m_brazo.dist
);
}
void Brazo2GL::draw() {
cerr << "A brazo: " << deg(m_brazo.angulo)
<< " A antbrazo: " << deg(m_antebrazo.angulo)
<< " \r";
glLoadIdentity();
glPushMatrix();
glColor3f(0.0f, 1.0f, 0.0f);
glBegin(GL_POINTS);
glVertex2f(m_xF, m_yF);
glEnd();
glPopMatrix();
glTranslatef(m_px, m_py, 0.0f);
glRotatef(deg(m_brazo.angulo),0,0,1);
glColor3f(1.0f, 0.0f, 0.0f);
glBegin(GL_LINES);
glVertex2f(0.0f, 0.0f);
glVertex2f(m_brazo.dist, 0.0f);
glEnd();
glTranslatef(m_brazo.dist,0.0f, 0.0f);
glRotatef(180+deg(m_antebrazo.angulo),0,0,1);
glColor3f(0.0f, 0.0f, 1.0f);
glBegin(GL_LINES);
glVertex2f(0.0f, 0.0f);
glVertex2f(m_antebrazo.dist, 0.0f);
glEnd();
}
int main() {
if (SDL_Init(SDL_INIT_VIDEO) == -1)
cout << "no se ha iniciado SDL" << endl;
SDL_Surface* screen = SDL_SetVideoMode(640, 640, 16,
SDL_OPENGL | SDL_GL_DOUBLEBUFFER |
SDL_HWPALETTE | SDL_HWSURFACE | SDL_HWACCEL);
SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
if (screen == NULL) {
cout << "No se ha iniciado la ventana OpeGL" << endl;
return 0;
}
initGL();
Brazo2GL brazo;
float ftime = 0;
int tics = SDL_GetTicks();
bool exit = false;
while (not exit) {
int tnow = SDL_GetTicks();
ftime = (tnow-tics)/1000.0f;
tics = tnow;
SDL_Event event;
while (SDL_PollEvent(&event)) {
switch (event.type) {
case SDL_QUIT:
exit = true;
break;
case SDL_KEYDOWN:
if (event.key.keysym.sym == SDLK_ESCAPE)
exit = true;
break;
case SDL_MOUSEBUTTONDOWN:
int x, y;
SDL_GetMouseState(&x, &y);
x = x*CLIP_REGION_W/SCREEN_S_W;
y = CLIP_REGION_H - y*CLIP_REGION_H/SCREEN_S_H;
brazo.mover_a(x, y, 2);
break;
}
}
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
brazo.update(ftime);
brazo.draw();
SDL_GL_SwapBuffers();
SDL_Delay(5);
}
SDL_Quit();
}
endaramiz escribió:He hecho un brazo de 2 grados de libertad que traza caminos rectilíneos de un punto a otro, durante un tiempo predefinido, por cinemática inversa.
g++ `sdl-config --libs` -lglut ejemplo.cc -o ejemplo
carlostex escribió:glTranslatef(m_px, m_py, 0.0f);
glVertex2f(0.0f, 0.0f);
glRotatef(deg(m_brazo.angulo),0,0,1);
y como hiciste para rotar las lineas con el eje en uno de sus extremos, ¿OpenGL te da una funcion para poner un eje de rotacion?
Si que se puede, usando el mismo método de antes. Primero hay que realizar una translación de manera que el eje quede en el punto (0,0) y a continuación aplicar la rotación. Luego se podrían seguir aplicando transformaciones.carlostex escribió:Solo me queda una duda, esas son lineas que se dibujan de un punto a otro, cada vez que se llama a la funcion dubujar, pero si fueran imagenes, por ejemplo la de un huezo, como le aplicarias las tranformaciones, por que ya no puedes dar puntos de donde empieza y termina, habria que girar la imagen cierto angulo con respecto a un eje de rotacion cituado en uno de sus extremos, existe algo asi en GL?
carlostex escribió:...haora entiendo, la forma en la que funciona GL se parece al lenguaje logo cuando dibujas con la tortuga(para quienes lo conoscan), y veo que es mas facil hacer esas transformaciones de esta manera, por lo que vale la pena aprender GL...
carlostex escribió:...haré una implementación usando solo SDL, buen articulo el que citaste, algunas ideas que tengo en mente son las que explica el articulo, así que pondré en practica lo que aprendí de álgebra y calculo vectorial...
Juanxo escribió:@endaramiz: como veo que te va gustando este temilla, te voy a recomendar un libro, y especialmente un autor.
Core Techniques and Algorithms in Game Programming. Su autor es un "vecino" tuyo: Daniel Sánchez Crespo-Dalmau, profesor de la Pompeu y del master de juegos de la Pompeu. No se si por allí podrás conseguir una copia que este en español, pero espero que la consigas porque viene muy bien explicado esto, y todo lo demás. Además, utiliza OpenGL en sus ejemplos, o pseudocodigo.
Si no puedes o no tienes ganas de buscarlo, cuando termine los examenes te puedo hacer un mini-resumen del tema de animacion, en el que trata bastante lo de bones y cinemáticas
Juan Carlos escribió:He visto el demo de JumpingJack y esta muy bueno. Creo que le faltaria un boton que sacara unas fotografias para obtener los fotogramas.
Lo encuentro normal, la programación de videojuegos abarca muchos temas. A partir de una base, se puede profundizar en los temas que más interesen (como pasa en la universidad).Juan Carlos escribió:Nota personal: Con respecto al libro Core Techniques and Algorithms in
Game Programming yo lo he leido y la verdad es que no lo recomiendo.
Para mi gusto, abarca demasiados temas, que van desde historia a estructuras de datos, y luego a graficos 2/3D, y solo profundiza algunos parrafos por cada tema.
Volver a Propuestas de desarrollo y concursos
Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado