Python开放语言:不使用openGL函数转换三角形(全局和局部)

bxfogqkk  于 2023-01-04  发布在  Python
关注(0)|答案(1)|浏览(97)

我尝试在没有OpenGL函数的情况下平移三角形,例如glTranslate*()或glScale*()。
我的渲染代码是:

def render(T):
    glClear(GL_COLOR_BUFFER_BIT)
    glLoadIdentity()
    # draw coordinate
    glBegin(GL_LINES)
    glColor3ub(255, 0, 0)
    glVertex2fv(np.array([0., 0.]))
    glVertex2fv(np.array([1., 0.]))
    glColor3ub(0, 255, 0)
    glVertex2fv(np.array([0., 0.]))
    glVertex2fv(np.array([0., 1.]))
    glEnd()
    #draw triangle
    glBegin(GL_TRIANGLES)
    glColor3ub(255,255,255)

    #this is the part that I'm trying to modify.
    glVertex2fv((**T**@ np.array([.0, .5, 1.]))[:-1])
    glVertex2fv((**T**@ np.array([.0, .0, 1.]))[:-1])
    glVertex2fv((**T**@ np.array([.5, .0, 1.]))[:-1])
    glEnd()

我知道如何翻译,旋转,和缩放矩阵的工作;例如:

T = np.identity(4)
T[:3 ,3] = [-.4, 0., .0]

# this shifts object by -.4 about x-axis.

但是,我不知道如何实现为代码。我有一个三角形与这些坐标,

glVertex2fv((**T**@ np.array([.0, .5, 1.]))[:-1])
glVertex2fv((**T**@ np.array([.0, .0, 1.]))[:-1])
glVertex2fv((**T**@ np.array([.5, .0, 1.]))[:-1])

T是我需要修改的部分。我只需要把T值赋为矩阵(就像我上面作为例子使用的那样),还是有什么我需要遵循的特定格式?
此外,我希望在按下某个键时进行转换,例如:

global T
def key_callback(window, key, scancode, action, mods):
global T

if key==glfw.KEY_1:
    if action==glfw.PRESS:
        T =

我应该在这里指定T值吗?

dluptydi

dluptydi1#

你需要一个有4个分量的向量,通过一个4x4的矩阵来转换它。顶点坐标是Homogeneous coordinates

glVertex2fv((T @ np.array([.0, .5, 1., 1]))[:-2])
glVertex2fv((T @ np.array([.0, .0, 1., 1]))[:-2])
glVertex2fv((T @ np.array([.5, .0, 1., 1]))[:-2])

最小示例:

from OpenGL.GLUT import *
from OpenGL.GLU import *
from OpenGL.GL import *
import numpy as np
import math

def render(T):
    glClear(GL_COLOR_BUFFER_BIT)
    glLoadIdentity()
    # draw coordinate
    glBegin(GL_LINES)
    glColor3ub(255, 0, 0)
    glVertex2fv(np.array([0., 0.]))
    glVertex2fv(np.array([1., 0.]))
    glColor3ub(0, 255, 0)
    glVertex2fv(np.array([0., 0.]))
    glVertex2fv(np.array([0., 1.]))
    glEnd()

    #draw triangle
    glBegin(GL_TRIANGLES)
    glColor3ub(255,255,255)
    glVertex2fv((T @ np.array([.0, .5, 1., 1]))[:-2])
    glVertex2fv((T @ np.array([.0, .0, 1., 1]))[:-2])
    glVertex2fv((T @ np.array([.5, .0, 1., 1]))[:-2])
    glEnd()

def display():
    t = glutGet(GLUT_ELAPSED_TIME) / 1000
    T = np.identity(4)
    T[:3 ,3] = [math.sin(t) * 0.5, 0., .0]
    glClearColor(0.2, 0.2, 0.2, 1)
    glLineWidth(5)
    render(T)
    glutSwapBuffers()
    glutPostRedisplay()

glutInit(sys.argv)
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA)
glutInitWindowSize(200, 200)
glutCreateWindow(b"OpenGL Window")
glutDisplayFunc(display)
glutMainLoop()

相关问题