2014-11-15 8 views
0

OpenGL 창에서 3D로 다른 시각을 얻으려고합니다.PyOpenGL : gluLookAt 동작?

코드를 실행하고 (gluLookAt가 주석 처리 된 것과 관련하여) 클릭 한 위치에서 빨간색 선 점을 마우스 왼쪽 버튼으로 클릭하면 마우스 오른쪽 버튼을 클릭하면 클릭 한 위치에 녹색 선이 정렬됩니다. 모든 것은 z = 0.0 인 xy 평면에서 발생합니다. 또한 의도하지 않은 -ve 값을 선택하게하지 않습니다.

'x', 'y'& 'z'키를 사용하여 장면을 둘러 보려고합니다. 내가 시도한 첫 번째 일은 '눈'의 위치에 대한 값을 변경하는 것이 었습니다. 그것은 완전한 재앙 일뿐입니다 !!

gluLookAt이 수행해야하는 작업을 여러 번 읽지 않더라도 결코 그렇게 할 수는 없습니다.

다음 코드에서는 원점에서 z 방향으로 10 단위로 뷰를 설정하려고합니다. z 축을 따라 원점을 보입니다.

(나는 그것이 http://i.imgur.com/IXlcKdo.png처럼 보이는하는 gluLookAt와 아무 떠날 경우) 그냥 검은 화면을 얻을

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에 설정된 축을 사용하지 않습니까?

답변

0

glOrtho 전에 glMatrixMode (GL_PROJECTION)가 누락되었습니다. 따라서 init 호출 후에는 identity (no-op) 투영 행렬과 lookview 앞에 직교 투영을 포함하는 modelview 행렬이 있습니다. 처음으로 그린 ​​프레임은 괜찮아 보입니다.

MODELVIEW 행렬을 올바르게 설정했지만 투영이 잘못되었습니다.

OpenGL 렌더링의 일반적인 패턴은 표시 코드를 두 가지 기능 또는 방법으로 분해하는 것입니다. 하나는 투사를 설정하고 다음과 같은 :

glMatrixMode(GL_PROJECTION) 
glOrtho/gluPerspective/whatever 
glMatrixMode(GL_MODELVIEW) 

두 번째 세트의 최대 관점과 같다 :

glLoadIdentity() 
gluLookAt