Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Menu

Mostrar Mensajes

Esta sección te permite ver todos los posts escritos por este usuario. Ten en cuenta que sólo puedes ver los posts escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menu

Mensajes - The-Force

#1
Programación gráfica / Re: Arma en FPS
08 de Septiembre de 2008, 01:16:15 AM
No basta con hacer glLoadIdentity() (el equivalente en direct3d) despues de renderizar la escena, hacer un traslate hacia la derecha y pintar el arma sobre la escena? De ese modo siempre pintas el arma a la derecha y apuntando en la misma direccion que  la camara. Es mas si la malla esta desplazada ya sobre su origen no habria ni ke hacer el traslate.

P.D: creo que a esto se referia tamat
#2
Programación gráfica / Camara y Sistemas de Coordenadas
19 de Junio de 2007, 09:41:20 PM
Bueno lo he modificado para tenerlo como tu dices y parece que funciona. El problema era el orden en que multiplicaba las matrices a la hora de rotar la camara.

Solucionado ...demomento xD

Saludos
#3
Programación gráfica / Camara y Sistemas de Coordenadas
19 de Junio de 2007, 02:13:40 PM
Nada que me lie de mala manera y me ha costao ver la luz un par de horas xD

Mas que nada me lio con que el sistema de la camara no es el de la "Camara a Mundo" sino el de "Mundo a Camara". Las rotaciones que se hacen a la camara no se aplican sobre el sistema "Camara a Mundo" sino sobre su inversa "Mundo a Camara" y ahi es donde fallaba pues intentaba rotar la camara y lo que me hacia era rotar el sistema Mundo.

Suele ocurrir que de vez en cuando me pongo a dudar en cosas que se supone ya tenia superadas xDD

Ahora mismo en mi clase Camara tengo tanto la matriz "Camara" (Camara a Mundo) como "Mundo"(Mundo a Camara). Cada vez que muevo la camara (Transformando "Mundo") Calculo la inversa y la guardo en "Camara". No se si esto es muy correcto pero lo cierto es que necesito la matriz "Camara" para hacer unos cuantos calculos, como añadir velocidad segun la orientacion de esta y esas cosas.
#4
Programación gráfica / Camara y Sistemas de Coordenadas
18 de Junio de 2007, 06:04:53 PM
Estoy tratando de implementar una camara para mi escena y estoy teniendo mas problemas de los que me esperaba.

Cada objeto (la camara es uno de ellos) de mi escena tiene asociando una matriz 4x4 con su matriz de transformacion para pasar al sistema global.

Que orden deberia seguir para multiplicar las matrices? Segun creia yo:

glloadIdentity()
glMultMatrixf(Inversa de la matriz camara);
Para cada objeto
  glpushmatrix
  glMultMatrixf(matriz objeto)
  dibujar objeto
  glpopmatrix


Pero no funciona :(
#5
con GL.glDepthMask(0) no se desactiva la escritura en el buffer Z ??

Otra cosa. El stencil se nota en los fps pero lo que mas se nota es el dibujo manual de la geometria de la sombra. Me pasa que en c# dibujar cualquie geometria cara a cara sin usar display lists va tremendamente lento y no se porque. En otro minijuego similar ke hice hace tiempo con c++ esto no pasaba de hecho no sabia ni usar display list en aquella epoca.
Como es posible que sin usar display list en c++ me fuera mas de 20 (por decir algo) veces mas rapido que en c#.
#6
Restaura el color a blanco como te dice mas arriba con glColor3f(1.0f,1.0f,1.0f); A mi me pasa lo mismo en la unica textura en la que no asigno material por desactivar la iluminacion. Supongo que sera cosa del GL_MODULATE, si es que usas ese modo u otro que blendee la textura.
#7
Bueno por fin me funcionan los shadow volumes portando mi codigo a Tao.
2 cosillas mas:

Cuando activo las sombras el framerate baja burtalmente. Que deberia hacer para solucionar esto? shaders?

Para explicaros el otro problema os cuento que lo que estoy haciendo es un  minijuego espacial (que tipico si xD). Para pintar el fondo de estrellas dibujo una esfera con una textura (tipico tambien) y con el test de profundidad desactivado, de esta manera todo lo que dibuje despues se dibujara sobre de esto. A continuacion se dibujan el resto de objetos de la escena. El problema viene con el shadow volume de los objetos en la escena ya que me proyectan sombras sombre este fondo y no deberia ya que al tener desactivado el test de profundidad al pintar el fondo, el stencil buffer no deberia fallar ahi puesto que no deberia haber informacion de profundidad para esos pixels. ... o me estoy equivocando ?

saludos
#8
Bueno despues de investigar un poco me voy a quedar con el port de ventana+opengl de NEHE para TAO, donde se ve claramente como modificar el pixel format, y partire desde ahi añadiendo lo que habia hecho con CSOpenGL.

Muchas gracias por la ayuda. Si consigo que me funcionen las sombras ya pondre algo por aqui ^^

Saludos
#9
Cita de: "Sante"
Te has asegurado de que al poner el pixel format le estas metiendo los bits del stencil para que lo active?

No tengo nidea de como cambiar el pixel fomat :(

Cita de: "Vicente"
CSGL no estaba muerto? Yo miraría TAO (que si que está bien vivo ;)).

CSOpenGL y CSGL creo que no son el mismo wrapper (como se diga). Uso el CSOpenGL por que es con el que hemos estado haciendo las practicas en la uni. Empezare a mirarme TAO
#10
Estoy tratando de implementar sombras con shadown volumes basandome en la leccion 27 de los tutoriales de NEHE y tengo algun problema relacionado con el stencil buffer.

Los shadown volumes son generados correctamente. Para asegurarme los he  dibujado en el color buffer y estan bien. El problema es ... o estoy haciendo algo mal con el stencil buffer o este no esta funcionando para nada (que es la sensacion que da).

Es la primera vez que uso el stencil buffer asi que no se muy bien que estoy haciendo con este codigo.

Pongo parte del codigo a continuacion (la parte que importa supongo):

Funcion que dibuja las sombras y que se llama despues de dibujar la escena.

       private void LanzarSombras()
       {
           GL.glPushAttrib(GL.GL_COLOR_BUFFER_BIT |
                           GL.GL_DEPTH_BUFFER_BIT |
                           GL.GL_ENABLE_BIT |
                           GL.GL_POLYGON_BIT |
                           GL.GL_STENCIL_BUFFER_BIT);
           GL.glDisable(GL.GL_LIGHTING);
           GL.glDepthMask(0);                    
           GL.glDepthFunc(GL.GL_LEQUAL);
           GL.glEnable(GL.GL_STENCIL_TEST);  
           GL.glColorMask(0, 0, 0, 0);                                    
           GL.glStencilFunc(GL.GL_ALWAYS, 1, 0xffffffff);

           foreach(CObjeto Objeto in Escena.Objetos)
           {
               if(Objeto.Tipo == 1)
               {
                   CObjeto3D O3D = (CObjeto3D)Objeto;
                   if (O3D.ProduceSombra)
                   {
                       foreach (CLuz Luz in Escena.Luces)
                       {
                           if (Luz.ProduceSombra)
                           {
                               CShadownVolume.MarcarCarasIluminadas(O3D, Luz.Sistema.Origen());
                               GL.glPushMatrix();
                               GL.glMultMatrixf(O3D.Sistema.ToFloatv());

                               // First Pass. Increase Stencil Value In The Shadow
                               GL.glFrontFace(GL.GL_CCW);
                               GL.glStencilOp(GL.GL_KEEP, GL.GL_KEEP, GL.GL_INCR);
                               DibujarSombra(O3D, Luz.Sistema.Origen());
                               // Second Pass. Decrease Stencil Value In The Shadow
                               GL.glFrontFace(GL.GL_CW);
                               GL.glStencilOp(GL.GL_KEEP, GL.GL_KEEP, GL.GL_DECR);
                               DibujarSombra(O3D, Luz.Sistema.Origen());
                               GL.glPopMatrix();
                           }
                       }
                   }
               }
           }

           GL.glFrontFace(GL.GL_CCW);
           GL.glColorMask(1, 1, 1, 1);
           GL.glColor4f(0.0f, 0.0f, 0.0f, 0.4f);
           GL.glEnable(GL.GL_BLEND);
           GL.glBlendFunc(GL.GL_SRC_ALPHA, GL.GL_ONE_MINUS_SRC_ALPHA);
           GL.glStencilFunc(GL.GL_NOTEQUAL, 0, 0xFFFFFFFF);
           GL.glStencilOp(GL.GL_KEEP, GL.GL_KEEP, GL.GL_KEEP);
           GL.glPushMatrix();
           GL.glLoadIdentity();
           GL.glBegin(GL.GL_TRIANGLE_STRIP);
               GL.glVertex3f(-10f, 10f, -0.10f);
               GL.glVertex3f(-10f, -10f, -0.10f);
               GL.glVertex3f(10f, 10f, -0.10f);
               GL.glVertex3f(10f, -10f, -0.10f);
           GL.glEnd();
           GL.glPopMatrix();
           GL.glPopAttrib();

       }


Agradeceria cualquier ayuda que me podais prestar para intentar sacar esto adelante  ^^.

Saludos
#11
Programación gráfica / Que Cae Mas Rapido? 1kg O 2kg?
02 de Febrero de 2006, 09:46:31 PM
 Nadie conoce una serie video-documentales muy viejos llamados "El universo mecanico" ????
52 episodios explicando desde la ley de caida de los cuerpos hasta mecanica cuantica.
Esta muy entretenida de ver y se aprende (o recuerda) mucho.
Todo bien explicadito y con formulitas.

Estan en el emule...
#12
Programación gráfica / Rotar Un Vector 3d
05 de Octubre de 2005, 05:44:17 PM
 Bueno... ya lo hago con matrices pero sigo teniendo el problema de ke cuanto mas giro el vector mas pequeño se me hace y no se como solucionarlo.
Se me ocurre ke cada vez que lo giro le podria calcular el vector unidad pero esto seria algo chapuza no?

nose... ayudaa
#13
Programación gráfica / Rotar Un Vector 3d
03 de Octubre de 2005, 10:40:39 PM
 Ahora el problema es que segun va girando su modulo va disminuyendo.
Me imagino que estara perdiendo precision o algo asi en alguna operacion.
aki el codigo ke gira el vector (Direccion):

void CNave::GirarIzq(){
  double ang = -Grado;
  double det = (cos(ang)*cos(ang))-(1*-sin(ang)*sin(ang));
  Direccion.x = ((Direccion.x*cos(ang)*1)-(1*-sin(ang)*Direccion.y))/det;
  Direccion.y = ((cos(ang)*Direccion.y*1)-(1*Direccion.x*sin(ang)))/det;
  Direccion.z = ((cos(ang)*cos(ang)*Direccion.z)-(Direccion.z*-sin(ang)*sin(ang)))/det;
}

Direccion.x ,.y , .z son double tambien

como podria corregirlo?
#14
Programación gráfica / Rotar Un Vector 3d
03 de Octubre de 2005, 07:57:31 PM
 ^^ Muchisimas gracias!!
asi si me funciona
#15
Programación gráfica / Rotar Un Vector 3d
03 de Octubre de 2005, 06:36:11 PM
 si yo tengo un vector v=(x,y,z) y quiero rotarlo que debo hacer?
Buscando he encontrado ke hay ke multiplicar mi vector como si de una matriz se tratara por otra matriz de transformacion.

vector (0,1,0) lo quiero girar 90º en el eje z

( 0 0 0 )_( cos(90)_-sen(90)___0  )_(  nx   0    0  )
( 0 1 0 )*( sen(90)__cos(90)__ 0  )=(   0   ny   0  )  
( 0 0 0 )_(___0_______0_____1  )_(   0    0   nz  )

donde  mi vector rotado pasaria a ser (nx,ny,nz) no?

nx = 0*cos(90)   +    0*sen(90)   +   0*0 = 0
ny = 0*-sen(90)   +   1*cos(90)   +   0*0 =  0
nz = 0*0   +   0*0   +   0*1 =  0

vector rotado (0,0,0)
resultado esperado (1,0,0)

igual esta todo mal de arriba a abajo... a saber. Iluminadme porfavor !!!





Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.