[pyopengl] [재현] 삼각형 그리기의 고급 버전

#-*-코딩 : 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 입력 루프    
결과는 다음을 보여줍니다.

 

추천

출처blog.csdn.net/FL1623863129/article/details/113995328