Programación Específica => Programación de Videojuegos => OpenGL => Mensaje iniciado por: djcloud en Miércoles 4 de Enero de 2006, 21:20
Título: Problemas Con La Perspectiva
Publicado por: djcloud en Miércoles 4 de Enero de 2006, 21:20
LLevo un par de semanas mirandome opengl, he conseguido hacer algun ejemplo sencillito usando visual basic.net. El problema: Tengo un programilla que dibuja la tipica tetera con glortho y la puedo rotar usando los cursores de direccion. el codigo es el siguiente:
Private Sub gl_SetupRC(ByVal sender As Object, ByVal e As System.EventArgs) Handles gl.SetupRC gl.MakeCurrent() gl.ClearColor(0.0!, 0.0!, 0.0!, 0.0!) gl.Ortho(-150.0!, 150.0!, -150.0!, 150.0!, -150.0!, 150.0!) gl.Color(255, 0, 0, 255) gl.Flush() gl.MakeNotCurrent() End Sub
Private Sub gl_Render(ByVal sender As Object, ByVal e As System.EventArgs) Handles gl.Render
Protected Overrides Function ProcessCmdKey(ByRef msg As System.Windows.Forms.Message, ByVal keyData As System.Windows.Forms.Keys) As Boolean If keyData = Keys.Up Then gl.MakeCurrent() gl.Rotate(10.0!, 10.0!, 0.0!, 0.0!) gl.MakeNotCurrent() gl_Render(Nothing, Nothing) ElseIf keyData = Keys.Down Then gl.MakeCurrent() gl.Rotate(10.0!, -10.0!, 0.0!, 0.0!) gl.MakeNotCurrent() gl_Render(Nothing, Nothing) ElseIf keyData = Keys.Right Then gl.MakeCurrent() gl.Rotate(10.0!, 0.0!, 10.0!, 0.0!) gl.MakeNotCurrent() gl_Render(Nothing, Nothing) ElseIf keyData = Keys.Left Then gl.MakeCurrent() gl.Rotate(10.0!, 0.0!, -10.0!, 0.0!) gl.MakeNotCurrent() gl_Render(Nothing, Nothing) ElseIf keyData = Keys.Add Then gl.MakeCurrent() gl.Rotate(10.0!, 0.0!, 0.0!, 10.0!) gl.MakeNotCurrent() gl_Render(Nothing, Nothing) ElseIf keyData = Keys.Subtract Then gl.MakeCurrent() gl.Rotate(10.0!, 0.0!, 0.0!, -10.0!) gl.MakeNotCurrent() gl_Render(Nothing, Nothing) End If End Function
Vale ahora quiero hacer lo mismo pero usando perspectiva, para ello cambie glortho por glfrustrum pero no se ve nada. luego lo cambie por gluperspective de la siguiente manera gl.gluperspetive(45.0!,1.0! (porque uso una ventana de 300X300),1.0!,400.0!) entonces estoy dentro de la tetera y esta gira alrededor mio, supuse entonces que antes de dibujar la tetera deberia desplazarme hacia atras pera verla desde fuera entonces puse un translate (0,0,-300) antes de dibujar la tetera, entonces veo esta bien, pero cuando toco los cursores para moverla desaparece de pantalla en vez de girar y no entiendo porque, he estado mirando tutorieles y ejem`plos y probando 50000 cosas y no consigo que funcione, en resumen si alguien me puede poner el codigo sea en vb o en c++ para que funcione como ese primer programa que pegue pero en perspectiva se lo agradeceria
Título: Re: Problemas Con La Perspectiva
Publicado por: Ruben3d en Viernes 6 de Enero de 2006, 16:23
Hola.
Para conseguir el efecto que buscas (rotar un objeto delante de la cámara) has de utilizar las siguientes llamadas en el mismo orden:
Código: Text
glLoadIdentity(); // 1
glTranslatef(0.0f, 0.0f, distancia); // 2
glRotatef(...); // 3
La llamada (1) va a resetear la matriz de transformación actual (asegurate de que sea la MODELVIEW), que se habría de hacer, como poco, al inicio de cada pintado de escena por fotograma (intuyo que ésto no lo estás haciendo). Si no se realiza esta llamada todas las transformaciones que vayas aplicando se irán acumulando en la matriz de transformación.
La llamada (2) es la que va a alejar el objeto del centro de coordenadas (posición de la cámara) según lo indicado en distancia.
Y ya por último, una o más llamadas (3) harán que el objeto rote sobre sí mismo.