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