- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
重要编辑:我正在使用 PyOpenGL OpenGL的绑定(bind)我试图不使用 glRotate
和 glTranslate
函数,但我还没有找到这两个函数的替代品。该函数已被弃用。我可以使用什么?
最佳答案
现代的方法是写一个 Shader程序,使用Vertex Array Objects并使用Uniform mat4
类型的变量。
与已弃用的固定功能管道相比,需要编写更多代码,但与 glBegin
/glEnd
绘制相比,好处是高度灵 active 和更好的性能。序列。
对于矩阵计算,可以使用 PyGLM库,这是 c++ 的 python 版本 OpenGL Mathematics (glm)图书馆。
例如缩放、绕 z 轴旋转矩阵角度
和平移可以通过以下方式设置:
model = glm.mat4(1)
model = glm.translate(model, glm.vec3(0.2, 0.2, 0))
model = glm.rotate(model, angle, glm.vec3(0, 0, 1))
model = glm.scale(model, glm.vec3(0.5, 0.5, 1))
与 Legacy OpenGL 相比操作glRoatate
,角度必须以弧度为单位设置。
请注意,除了使用 PyGLM 之外,还可以使用流行的 NumPy图书馆和numpy.matrix
,但 PyGLM 更接近您从旧版 OpenGL 以及函数 glScale
、glTranslate
和 glRotate
中了解到的内容。
当然,也可以在不使用任何库的情况下设置 4x4 矩阵并自行实现矩阵运算。
请参阅小示例程序,它使用 PyOpenGL和 PyGLM (在模块 math
和 ctypes
旁边):
import math
import ctypes
import glm
from OpenGL.GLUT import *
from OpenGL.GL import *
from OpenGL.GL.shaders import *
class MyWindow:
__caption = 'OpenGL Window'
__vp_size = [800, 600]
__vp_valid = False
__glut_wnd = None
__glsl_vert = """
#version 450 core
layout (location = 0) in vec3 a_pos;
layout (location = 1) in vec4 a_col;
out vec4 v_color;
layout (location = 0) uniform mat4 u_proj;
layout (location = 1) uniform mat4 u_view;
layout (location = 2) uniform mat4 u_model;
void main()
{
v_color = a_col;
gl_Position = u_proj * u_view * u_model * vec4(a_pos.xyz, 1.0);
}
"""
__glsl_frag = """
#version 450 core
out vec4 frag_color;
in vec4 v_color;
void main()
{
frag_color = v_color;
}
"""
__program = None
__vao = None
__vbo = None
def __init__(self, w, h):
self.__vp_size = [w, h]
glutInit()
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH)
glutInitWindowSize(self.__vp_size[0], self.__vp_size[1])
__glut_wnd = glutCreateWindow(self.__caption)
self.__program = compileProgram(
compileShader( self.__glsl_vert, GL_VERTEX_SHADER ),
compileShader( self.__glsl_frag, GL_FRAGMENT_SHADER ),
)
attribures = [
# x y z R G B A
-0.866, -0.5, 0, 1, 0, 0, 1,
0.866, -0.5, 0, 1, 1, 0, 1,
0, 1.0, 0, 0, 0, 1, 1
]
vertex_attributes = (GLfloat * len(attribures))(*attribures)
itemsize = ctypes.sizeof(ctypes.c_float)
self.__vbo = glGenBuffers(1)
glBindBuffer(GL_ARRAY_BUFFER, self.__vbo)
glBufferData(GL_ARRAY_BUFFER, vertex_attributes, GL_STATIC_DRAW)
self.__vao = glGenVertexArrays(1)
glBindVertexArray(self.__vao)
glVertexAttribPointer(0, 3, GL_FLOAT, False, 7*itemsize, None)
glEnableVertexAttribArray(0)
glVertexAttribPointer(1, 4, GL_FLOAT, False, 7*itemsize, ctypes.c_void_p(3*itemsize))
glEnableVertexAttribArray(1)
glUseProgram(self.__program)
glutReshapeFunc(self.__reshape)
glutDisplayFunc(self.__mainloop)
def run(self):
self.__starttime = 0
self.__starttime = self.elapsed_ms()
glutMainLoop()
def elapsed_ms(self):
return glutGet(GLUT_ELAPSED_TIME) - self.__starttime
def __reshape(self, w, h):
self.__vp_valid = False
def __mainloop(self):
if not self.__vp_valid:
self.__vp_size = [glutGet(GLUT_WINDOW_WIDTH), glutGet(GLUT_WINDOW_HEIGHT)]
self.__vp_valid = True
glViewport(0, 0, self.__vp_size[0], self.__vp_size[1])
proj = glm.mat4(1)
view = glm.mat4(1)
model = glm.mat4(1)
aspect = self.__vp_size[0]/self.__vp_size[1]
aspect_x = aspect if self.__vp_size[0] > self.__vp_size[1] else 1.0
aspect_y = 1/aspect if self.__vp_size[0] < self.__vp_size[1] else 1.0
proj = glm.ortho(-aspect_x, aspect_x, -aspect_y, aspect_y, -1.0, 1.0)
angle = self.elapsed_ms() * math.pi * 2 / 3000.0
model = glm.translate(model, glm.vec3(0.2, 0.2, 0))
model = glm.rotate(model, angle, glm.vec3(0, 0, 1))
model = glm.scale(model, glm.vec3(0.5, 0.5, 1))
glUniformMatrix4fv(0, 1, GL_FALSE, glm.value_ptr(proj) )
glUniformMatrix4fv(1, 1, GL_FALSE, glm.value_ptr(view) )
glUniformMatrix4fv(2, 1, GL_FALSE, glm.value_ptr(model) )
glClearColor(0.2, 0.3, 0.3, 1.0)
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
glDrawArrays(GL_TRIANGLES, 0, 3)
glutSwapBuffers()
glutPostRedisplay()
window = MyWindow(800, 600)
window.run()
关于python - 现代 glTranslate 和 glRotate 的替代品是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57187663/
我想我明白为什么调用 glRotate(#, 0, 0, 0) 会导致被零除。旋转向量 a 被归一化:a' = a/|a| =一个/0 这是 glRotate 可能导致被零除的唯一情况吗?是的,我知道
介绍:我正在用 opengl 开发一个小塔防游戏,目前我只是对一个小问题感到绝望...... 我希望塔上的射弹能够以头部面向单位进行瞄准。所以我的问题更多的是一个数学问题,但它属于 opengl :)
我有一个简单的 Android OpenGL-ES 应用程序,并且由于所有模型都非常简单(<10 个顶点!)我已经实现了一个全局“世界”类来跟踪所有顶点,并执行一对 GL 命令在帧渲染上。 每个模型对
我想获得鼠标效果。 省略鼠标坐标采集等,问题的要点是: 使用固定的 opengl 函数,这可以做到 glRotate(angley,0,1,0); glRotate(anglex,1,0,0); 使用
我正在尝试绕轴旋转立方体,我正在做的是: glTranslatef(0.0f, 0.0f, -60.0f); glRotatef(angle, 0.0f, 1.0f, 0.0f); 我
我有一个八边形,我需要将其旋转和平移到 10,000 个不同的位置/角度。角度和坐标动态变化。 如果我在即时模式下使用 glRotate 和 glTranslate,由于客户端/服务器之间的所有来回,
我正在使用 glRotate 和 glTranslate 函数来围绕自身旋转模型。但是当我运行我的程序时,我的模型正在围绕它旁边的一个点旋转。这是我的模型定义: private static fina
我需要一个函数来将类似 glTranslate() 的翻译应用于一个点。有人知道像 glTranslate() 和 glRotate() 这样的函数可以修改和检索要相乘的矩阵吗? 最佳答案 有成千上万
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 3 年前。 Improve this ques
我一直在研究在 OpenGL 中实现滚动、俯仰和偏航式旋转的问题,但在线提供的相关资料有限。问题的关键是在对象旋转时找到更新的局部轴。例如,围绕 X 旋转会导致局部 Y 轴和 Z 轴发生变化。随后的旋
我正在绘制一个矩形 block : GLfloat cubeVertexV[] = { // FRONT -0.5f, -1.0f, 0.5f, 0.5f, -1.0f,
假设我使用 glRotate 根据一些任意用户输入来转换当前 View (即,如果按下左键则 rtri+=2.5f) glRotatef(rtri,0.0f,1.0f,0.0f); 然后我在旋转后的位
我正在编写一个 GUI,用于使用 Python 显示 6 轴运动传感器的输出。窗口应该有一个实时显示旋转的 OpenGL Widget。通常我会为我的 openGLWidget 编写一个单独的类,但由
我正在寻找矩阵的解释(或图像)以及在对其进行平移、旋转和缩放时矩阵如何变化...(一个单元格带有 sin(angle),另一个单元格的 x 坐标为翻译) 最佳答案 现在,忽略平移,这是一个比旋转和缩放
在 MacOSX 上,“man glRotate”会显示 glRotate 联机帮助页。 在 ubuntu 上,安装了 manpages-dev 和 manpages-posix-dev,“man g
我已阅读此处的文档:http://www.opengl.org/sdk/docs/man2/xhtml/glRotate.xml 它指定角度以度为单位。它说 X、Y、Z 是向量。如果我说 glRota
我有一个 C++/OpenGL 程序,它以不同的旋转角度创建许多圆柱体,因此它们看起来都是相连的。我添加了一个导出方法来为 Maya 编写具有相同绘制方法的 Python 脚本,这样我就可以加载脚本。
在 OpenGL ES 1.x 中,可以先执行 glTranslate,然后执行 glRotate,以修改旋转中心的位置(即 围绕给定点旋转 )。据我了解,在 OpenGL ES 2.0 中,矩阵计算
我是一名优秀的程序员,十分优秀!