• Jueves 25 de Abril de 2024, 05:45

Autor Tema:  Problemas Con La Perspectiva  (Leído 1745 veces)

djcloud

  • Nuevo Miembro
  • *
  • Mensajes: 1
    • Ver Perfil
Problemas Con La Perspectiva
« en: Miércoles 4 de Enero de 2006, 21:20 »
0
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

        gl.MakeCurrent()
        gl.Clear(gl.glColorBufferBit)
        gl.auxWireTeapot(80.0!)
        gl.Flush()
        gl.MakeNotCurrent()
        gl.SwapBuffers()

    End Sub

    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

Ruben3d

  • Moderador
  • ******
  • Mensajes: 710
  • Nacionalidad: es
    • Ver Perfil
    • Web personal
Re: Problemas Con La Perspectiva
« Respuesta #1 en: Viernes 6 de Enero de 2006, 16:23 »
0
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
  1. glLoadIdentity(); // 1
  2. glTranslatef(0.0f, 0.0f, distancia); // 2
  3. glRotatef(...); // 3
  4.  
  5.  

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.

Espero que te haya servido de ayuda.

Un saludo,

ruben3d