首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PyOpenGL: gluLookAt行为?

PyOpenGL: gluLookAt行为?
EN

Stack Overflow用户
提问于 2014-11-16 03:09:13
回答 1查看 649关注 0票数 0

我正在尝试在OpenGL窗口上获得不同的3D透视图。

如果您运行代码(使用注释掉的gluLookAt )并左键单击您单击的位置处的红色线条,则右键单击,绿色线条将与您单击的位置对齐。所有这些都发生在xy平面的z=0.0中,而且它不会让你选择任何-ve y值(这是故意的)。

我正在尝试使用“x”,“y”和“z”键在场景中平移。我尝试的第一件事是改变“眼睛”所在位置的值。这完全是一场灾难!!

无论我读了多少遍gluLookAt应该做的事情,我都不能让它做到!

在下面的代码中,我尝试在z方向上将视图设置为远离原点10个单位,沿z轴朝向原点。

我只是得到了一个黑屏(如果我省略了与gluLookAt有关的任何事情,它看起来就像http://i.imgur.com/IXlcKdo.png )

代码语言:javascript
复制
from OpenGL.GL import *
from OpenGL.GLU import *
from OpenGL.GLUT import *
import numpy as np
import sys

global lp, lq, rp, rq, z, eyeX, eyeY, eyeZ
lp = 0.0
lq = 2.5
rp = 0.0
rq = 2.5
z = 0.0

# gluLookAt 'eye' coordinates
eyeX = 0.0 
eyeY = 0.0
eyeZ = 10.0

def init():
    global eyeX, eyeY, eyeZ
    glClearColor(0.0, 0.0, 0.0, 1.0)
    glOrtho(-10.0, 10.0, -10.0, 10.0, -10.0, 10.0)
    glClear(GL_COLOR_BUFFER_BIT)
    glMatrixMode(GL_MODELVIEW)
    glLoadIdentity()
    gluLookAt(eyeX, eyeY, eyeZ, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0)

def plotdial():
    global lp, lq, rp, rq, eyeX, eyeY, eyeZ
    #lOrigin = np.array((0.0, 0.0, 0.0))
    rOrigin = np.array((5.0, 0.0, 0.0))
    radius = 2.5

    glClear(GL_COLOR_BUFFER_BIT)
    glMatrixMode(GL_MODELVIEW)
    glLoadIdentity()
    gluLookAt(eyeX, eyeY, eyeZ, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0)  

    # Left arm unit vector calculation
    lVec =  np.array((lp, lq, z))
    lMag = np.linalg.norm(lVec)
    lVec = (lVec/lMag)*radius
    glColor3f(1.0, 0.0, 0.0)
    glLineWidth(3.0)
    glBegin(GL_LINES)
    glVertex3f(0.0, 0.0, z)
    glVertex3f(lVec[0], lVec[1], z)
    glEnd()
    glLineWidth(1.0)
    glColor3f(0.0, 0.0, 1.0)
    glutWireSphere(2.5, 25, 25)

    # Right 
    glPushMatrix()
    glTranslatef(rOrigin[0], rOrigin[1], z)
    glColor3f(0.0, 1.0, 0.0)
    glLineWidth(3.0)
    glBegin(GL_LINES)
    glVertex3f(0.0, 0.0, z)
    rVec =  np.array((rp, rq, z))
    rMag = np.linalg.norm(rVec)
    rVec = (rVec/rMag)*radius 
    glVertex3f(rVec[0], rVec[1], z)
    glEnd()
    glLineWidth(1.0)
    glColor3f(0.0, 0.0, 1.0)
    glutWireSphere(2.5, 25, 25)
    glPopMatrix()

    glFlush()

def keyboard(key, x, y):
    global glutshape, solid, eyeX, eyeY, eyeZ
    step = 0.01
    if key == chr(27) or key == "q":
        sys.exit()
    if key == "x":
        eyeX -= step
    if key == "X":
        eyeX += step
    if key == "y":
        eyeY -= step
    if key == "Y":
        eyeY += step
    if key == "z":
        eyeZ -= step
    if key == "Z":
        eyeZ -= step
    glutPostRedisplay()

def mouse(button, state, x, y):
    global lp, lq, rp, rq
    o_lp = lp    
    o_lq = lq
    o_rp = rp
    o_rq = rq
    if button == GLUT_LEFT_BUTTON and state == GLUT_DOWN:
        lp = -10.0 + x/500.0 * 20
        lq = 10 - y/500.0 * 20   
        if lq < 0.0:
            lp = o_lp
            lq = o_lq
    if button == GLUT_RIGHT_BUTTON and state == GLUT_DOWN:
        rp = -10.0 + x/500.0 * 20 - 5 # -5 is 2*radius
        rq = 10 - y/500.0 * 20 
        if rq < 0.0:
            rp = o_rp
            rq = o_rq
    glutPostRedisplay()

def main():
    glutInit(sys.argv)
    glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB)
    glutInitWindowSize(500,500)
    glutInitWindowPosition(50,50)
    glutCreateWindow('Dial Trial')
    glutDisplayFunc(plotdial)
    glutKeyboardFunc(keyboard)
    glutMouseFunc(mouse)
    init()
    glutMainLoop()

main() 

那么这里的故事是什么呢?是不是glLookAt没有使用glOrtho中设置的轴?

EN

回答 1

Stack Overflow用户

发布于 2014-11-17 09:37:43

您缺少glOrtho之前的glMatrixMode(GL_PROJECTION)。因此,在init调用之后,您有一个标识(no-op)投影矩阵和一个模型视图矩阵,该矩阵恰好在lookat之前包含正交投影。我假设你画的第一个框架看起来没问题。

之后,您正确设置了MODELVIEW矩阵,但投影是错误的。

OpenGL呈现的常见模式是将显示代码分成两个函数或方法。其中一个设置了投影,看起来像这样:

代码语言:javascript
复制
glMatrixMode(GL_PROJECTION)
glOrtho / gluPerspective / whatever
glMatrixMode(GL_MODELVIEW)

第二个设置视点,如下所示:

代码语言:javascript
复制
glLoadIdentity()
gluLookAt
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26949617

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档