python openGL:在没有 openGL 功能的情况下转换三角形(全局和局部)
python openGL: translate triangle(global & local) without openGL function
我正在尝试平移没有 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
值吗?
您需要一个包含 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()
我正在尝试平移没有 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
值吗?
您需要一个包含 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()