#-*-코딩 : utf-8-*-
# -------------------------------------------
# quidam_02.py 회전, 확대 / 축소, 시점 및 기준점 변경
------------------------------------------ -
from OpenGL.GL import *
from OpenGL.GLU import *
from OpenGL.GLUT import *
import numpy as np
IS_PERSPECTIVE = True # 투시 투영
VIEW = np.array ([-0.8, 0.8, -0.8, 0.8, 1.0, 20.0]) #
보기 볼륨 의 왼쪽 / 오른쪽 / 아래쪽 / 위쪽 / 근접 / 먼 6면 SCALE_K = np .array ([1.0, 1.0, 1.0]) # 모델 스케일링
EYE = np.array ([0.0, 0.0, 2.0]) # 눈의 위치 (기본 z 축의 양의 방향)
LOOK_AT = np.array ([0.0, 0.0, 0.0]) # 조준 방향의 기준점 (기본값은 좌표 원점)
EYE_UP = np.array ([0.0, 1.0, 0.0]) # 관찰자의 위쪽을 정의합니다 (기본값 y 축 양의 방향)
WIN_W, WIN_H = 640, 480 # 창의 너비와 높이를 저장하는 변수
LEFT_IS_DOWNED = False # 마우스 왼쪽 버튼을 눌렀을 때
MOUSE_X, MOUSE_Y = 0, 0 # 저장되는 시작 위치 마우스 변위 검사
def getposture () :
global EYE, LOOK_AT
dist = np.sqrt (np.power ((EYE-LOOK_AT), 2) .sum ())
if dist> 0 :
phi = np.arcsin ((EYE [1] -LOOK_AT [1]) / dist)
theta = np.arcsin ((EYE [0] -LOOK_AT [0]) / (dist * np.cos (phi)))
else :
phi = 0.0
theta = 0.0
return dist, phi, theta
DIST, PHI, THETA = getposture () # 눈과 관찰 대상 사이의 거리, 고도 각도 및 방위각
def init () :
glClearColor (0.0, 0.0, 0.0, 1.0) # 캔버스 배경색을 설정합니다. 참고 : 여기에는 4 개의 매개 변수가 있어야합니다.
glEnable (GL_DEPTH_TEST) # 오 클루 전 관계를 실현하기 위해 깊이 테스트를 켭니다.
glDepthFunc (GL_LEQUAL) # 깊이 테스트 기능을 설정합니다 (GL_LEQUAL은 옵션 중 하나 일뿐입니다).
데프 () 그릴 :
글로벌 IS_PERSPECTIVE, VIEW
글로벌 EYE, LOOK_AT, EYE_UP
글로벌 SCALE_K
글로벌 WIN_W, WIN_H의
#을清除屏幕及深度缓存
glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
#设置投影(透视投影)
glMatrixMode (GL_PROJECTION)
glLoadIdentity 함수 ()
WIN_W 경우> WIN_H :
if IS_PERSPECTIVE :
glFrustum (VIEW [0] * WIN_W / WIN_H, VIEW [1] * WIN_W / WIN_H, VIEW [2], VIEW [3], VIEW [4], VIEW [5])
else :
glOrtho (VIEW [0] * WIN_W / WIN_H, VIEW [1] * WIN_W / WIN_H, VIEW [2], VIEW [3], VIEW [4], VIEW [5])
else :
IS_PERSPECTIVE 인 경우 :
glFrustum (VIEW [0], VIEW [1], VIEW [2] * WIN_H / WIN_W, VIEW [3] * WIN_H / WIN_W, VIEW [4], VIEW [5])
else :
glOrtho (VIEW [0], VIEW [1], VIEW [2] * WIN_H / WIN_W, VIEW [3] * WIN_H / WIN_W, VIEW [4], VIEW [5])
# 모델 뷰 설정
glMatrixMode (GL_MODELVIEW)
glLoadIdentity ()
# 기하학적 변환
glScale (SCALE_K [0], SCALE_K [1], SCALE_K [2])
# 시점 설정
gluLookAt (
EYE [0], EYE [1], EYE [2],
LOOK_AT [0], LOOK_AT [1], LOOK_AT [2],
EYE_UP [0], EYE_UP [1], EYE_UP [2]
)
# 뷰포트 설정
glViewport (0, 0, WIN_W, WIN_H)
# -------------------- ------------------------------------------
glBegin (GL_LINES) # 선분 그리기 시작 (세계 좌표계)
# x 축을 빨간색으로 그리기
glColor4f (1.0, 0.0, 0.0, 1.0) # 현재 색상을 빨간색 불투명으로 설정
glVertex3f (-0.8, 0.0, 0.0 ) # x 축 정점 설정 (X 축 음의 방향)
glVertex3f (0.8, 0.0, 0.0) # x 축 정점 설정 (x 축 양의 방향)
# y 축을 녹색으로 그린
glColor4f (0.0, 1.0 , 0.0, 1.0) # 현재 색상을 녹색 및 불투명으로 설정
glVertex3f (0.0, -0.8, 0.0) # y 축 정점 (y 축의 음의 방향) 설정
glVertex3f (0.0, 0.8, 0.0) # Set y 축 정점 (y 축의 양의 방향)
# z 축을 파란색으로 그
립니다. glColor4f (0.0, 0.0, 1.0, 1.0) # 현재 색상을 파란색과 불투명 한
glVertex3f (0.0, 0.0, -0.8로 설정) ) # z 축 정점 설정 (z 축 음의 방향)
glVertex3f (0.0, 0.0, 0.8) # z 축 정점 설정 (z 축 양의 방향))
GlEnd () # end drawing 선분
# ------------------------------------------------- --------------
glBegin (GL_TRIANGLES) # 삼각형 그리기 시작 (z 축의 음의 절반)
glColor4f (1.0, 0.0, 0.0, 1.0) # 현재 색상을 빨간색으로 설정 및 불투명
glVertex3f (-0.5, -0.366, -0.5) # 삼각형 정점 설정
glColor4f (0.0, 1.0, 0.0, 1.0) # 현재 색상을 녹색 및 불투명으로 설정
glVertex3f (0.5, -0.366, -0.5) # triangle vertex
glColor4f (0.0, 0.0, 1.0, 1.0) # 현재 색상을 파란색 불투명으로 설정
glVertex3f (0.0, 0.5, -0.5) # 삼각형의 꼭지점 설정
glEnd () # 삼각형 그리기 종료
# ---- --------------- ----------------------------------- ---------
glBegin (GL_TRIANGLES) # start 삼각형을 그
립니다 ( z 축의 양의 절반) glColor4f (1.0, 0.0, 0.0, 1.0) # 현재 색상을 빨간색과 불투명으로 설정
glVertex3f (-0.5, 0.5, 0.5) # 삼각형 정점 설정
glColor4f (0.0, 1.0, 0.0, 1.0) # 현재 색상을 녹색과 불투명으로 설정
glVertex3f (0.5, 0.5, 0.5) # 삼각형 정점 설정
glColor4f (0.0, 0.0, 1.0, 1.0) # 현재 색상을 파란색 불투명으로 설정
glVertex3f (0.0, -0.366, 0.5) # 삼각형의 꼭지점 설정
glEnd () # 삼각형 그리기 종료
# ---------- --------- ----------------------------------------- ---
glutSwapBuffers () # 도면 내용을 표시 할 버퍼 영역 전환
def reshape (width, height) :
global WIN_W, WIN_H
WIN_W, WIN_H = width, height
glutPostRedisplay ()
def mouseclick (button, state, x, y) :
global SCALE_K
글로벌 LEFT_IS_DOWNED
global MOUSE_X, MOUSE_Y
MOUSE_X, MOUSE_Y = x, y
if button == GLUT_LEFT_BUTTON :
LEFT_IS_DOWNED = state == GLUT_DOWN
elif button == 3 :
SCALE_K * = 1.05
glutPostRedisplay ()
elif button == 4 :
SCALE_K * = 0.95
glutPostRedisplay ()
def mousemotion (x, y) :
글로벌 LEFT_IS_DOWNED
글로벌 EYE, EYE_UP
글로벌 MOUSE_X, MOUSE_Y
글로벌 DIST, PHI, THETA
글로벌 WIN_W, LEFT_IS_DOWNED 인
경우 WIN_H :
dx = MOUSE_X-x
dy = y-MOUSE_Y
MOUSE_X, MOUSE_Y = x, y
PHI + = 2 * np.pi * dy / WIN_H
PHI % = 2 * np.pi
THETA + = 2 * np.pi * dx / WIN_W
THETA % = 2 * np.pi
r = DIST * np.cos (PHI)
EYE [1] = DIST * np.sin (PHI )
EYE [0] = r * np.sin (THETA)
EYE [2] = r * np.cos (THETA)
if 0.5 * np.pi <PHI <1.5 * np.pi :
EYE_UP [1] = -1.0
else :
EYE_UP [1] = 1.0
glutPostRedisplay ()
def keydown (key, x, y) :
global DIST, PHI, THETA
global EYE, LOOK_AT, EYE_UP
global IS_PERSPECTIVE, VIEW
if key in [b'x ', b'X', b'y ', b'Y', b'z ', b'Z'] :
if key == b'x ': # 瞄准 参考 点 x 减小
LOOK_AT [0]-= 0.01
elif key == b'X ': # 조준 기준 x 증가
LOOK_AT [0] + = 0.01
elif key == b'y': # 조준 기준점 y 감소
LOOK_AT [1]-= 0.01
elif key == b 'Y ': #
LOOK_AT 를 증가시키기 위해 원점 y를 조준 [1] + = 0.01
elif key == b'z': #
LOOK_AT 를 감소 시키기 위해 원점 z를 조준 [2]-= 0.01
elif key == b'Z ': # 기준점 조준 z
LOOK_AT [2] 증가 + = 0.01
DIST, PHI, THETA = getposture ()
glutPostRedisplay ()
elif key == b'\ r ': # Enter 키, 시점이 앞으로 이동합니다
EYE = LOOK_AT + (EYE- LOOK_AT) * 0.9
DIST, PHI, THETA = getposture ()
glutPostRedisplay ()
elif key == b '\ x08': # 백 스페이스 키, 시점 뒤로
EYE = LOOK_AT + (EYE-LOOK_AT) * 1.1
DIST, PHI, THETA = getposture ()
glutPostRedisplay ()
elif key == b '': # 스페이스 바, 프로젝션 모드 전환
IS_PERSPECTIVE = IS_PERSPECTIVE가 아님
glutPostRedisplay ()
__name__ == "__main__"인 경우 :
glutInit ()
displayMode = GLUT_DOUBLE | GLUT_ALPHA | GLUT_DEPTH
glutInitDisplayMode (displayMode)
glutInitWindowSize (WIN_W, WIN_H)
glutInitWindowPosition (300, 200)
glutCreateWindow ( 'Quidam Of OpenGL')
init () # 캔버스 초기화
glutDisplayFunc (draw) # 콜백 함수 등록 draw ()
glutReshapeFunc (reshape) # 창에 응답하는 함수 등록 reshape ()
glutMouseFunc (mouseclick) # 마우스 클릭에 반응하는 함수 등록 mouseclick ()
glutMotionFunc (mousemotion) # 마우스 드래그에 반응하는 함수 등록 mousemotion ()
glutKeyboardFunc (keydown) # 키보드 입력 기능 등록 keydown ()
glutMainLoop () # glut main 입력 루프
결과는 다음을 보여줍니다.