簡體   English   中英

如何使用gluLookAt()修改OpenGL的透視圖?

[英]How do I modify the perspective of an OpenGL using gluLookAt()?

我想更改查看創建的模型的角度。 我環顧四周,發現了gluLookAt()函數,我認為該函數可以做我不想做的事情。 但是,我絕對不知道如何使用gluLookAt()。 我將其放入下面的代碼中,但似乎無法使其正常運行。 無論如何,我的代碼(python):

#!/usr/bin/env python

from OpenGL.GL import *
from OpenGL.GLU import *

import pygame

def pyramid():

    #draw a pyramid here

def cube():

    #draw a cube here

class mainClass():
    def mainMethod(self):   
        from sys import exit

        print ("Initalizing...")

        resolution = (400, 300)

        pygame.init()
        screen = pygame.display.set_mode(resolution, pygame.OPENGL|pygame.DOUBLEBUF)

        self.xPer, self.yPer, self.zPer = 0, 0, 0
        print ("Doing GL stuff...")
        glViewport(self.xPer, self.yPer, resolution[0], resolution[1])

        glMatrixMode(GL_PROJECTION)
        glLoadIdentity()
        gluPerspective(45.0, float(resolution[0]) / resolution[1], 0.1, 1000.0)#Distance, 

        glMatrixMode(GL_MODELVIEW)
        glLoadIdentity()

        print ("More GL stuff...")
        glEnable(GL_DEPTH_TEST)

        #glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST)

        glShadeModel(GL_SMOOTH)
        glClearColor(0.0, 0.0, 0.0, 0.0)

        print ("Minor details...")
        clock = pygame.time.Clock()

        rot_tri = 0
        rot_quad = 0

        print ("Mainloop...")
        while True:

            for event in pygame.event.get():

                if event.type == pygame.QUIT:
                    pygame.quit()
                    exit()
                if event.type == pygame.KEYDOWN:
                    if event.key == pygame.K_ESCAPE:
                        pygame.quit()
                        exit()
                    elif event.key == pygame.K_a:
                        self.xPer += 50

                    elif event.key == pygame.K_d:
                        self.xPer -= 50
                        #glViewport(self.xPer, self.yPer, resolution[0], resolution[1])
                    elif event.key == pygame.K_w:
                        self.yPer -= 50
                        #glViewport(self.xPer, self.yPer, resolution[0], resolution[1])
                    elif event.key == pygame.K_s:
                        self.yPer += 50
                        #glViewport(self.xPer, self.yPer, resolution[0], resolution[1])
                    elif event.key == pygame.K_f:
                        self.zPer += 50
                    elif event.key == pygame.K_v:
                        self.zPer -= 50


            glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);

            glMatrixMode(GL_MODELVIEW);
            glLoadIdentity()
            gluLookAt(10, 10, 10, self.xPer, self.yPer, self.zPer, 0, 1, -1);

            glLoadIdentity()
            glTranslatef(-1.5, 0.0, -6.0)
            glRotatef(rot_tri, 0.0, 1.0, 0.0)
            pyramid()

            glLoadIdentity()
            glTranslate(1.5, 0.0, -6.0)
            glRotatef(rot_quad, 1.0, 0.0, 0.0)
            cube()

            rot_tri += 2.0
            rot_quad -= 1.5

            pygame.display.set_caption("hello_opengl.py FPS: %i" % clock.get_fps())

            pygame.display.flip()
            clock.tick()

t = mainClass()
t.mainMethod()

我想要此代碼要做的就是修改查看一些旋轉的金字塔和立方體的角度。 誰能解釋如何修改此代碼以使用gluLookAt()?

PS:是否有一個很好的頁面可以解釋OpenGL(矩陣,3D數學,無論glLoadIdentity()做什么,等等)? 我可以編寫代碼,但是我不知道自己在做什么。

您完全錯過了gluLookAt 您必須在當前矩陣上調用一次,然后不要對其進行清理和修改,以便相應地繪制另一個對象。

當您這樣做時:

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(10, 10, 10, ...); // <-- this line has no effect
glLoadIdentity();

gluLookAt函數與glRotateglTranslate函數一樣。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM