三维效果速度表盘距离pyqt程序
时间: 2023-10-30 21:02:47 浏览: 42
您可以使用PyQt中的QOpenGLWidget和QOpenGLFunctions来实现一个具有三维效果的速度表盘。以下是一个简单的示例代码:
```python
from PyQt5.QtWidgets import QApplication, QMainWindow, QOpenGLWidget
from PyQt5.QtGui import QOpenGLShaderProgram, QOpenGLShader, QColor, QMatrix4x4
from PyQt5.QtCore import Qt, QTimer
class Speedometer(QOpenGLWidget):
def __init__(self, parent=None):
super().__init__(parent)
self.timer = QTimer(self)
self.timer.timeout.connect(self.update)
self.timer.start(10)
self.angle = 0.0
def initializeGL(self):
self.gl = self.context().versionFunctions()
self.gl.initializeOpenGLFunctions()
self.gl.glClearColor(0.0, 0.0, 0.0, 1.0)
self.program = QOpenGLShaderProgram(self)
self.program.addShaderFromSourceCode(QOpenGLShader.Vertex, """
attribute vec3 a_position;
attribute vec3 a_normal;
uniform mat4 u_mvp_matrix;
varying vec3 v_normal;
void main() {
v_normal = a_normal;
gl_Position = u_mvp_matrix * vec4(a_position, 1.0);
}
""")
self.program.addShaderFromSourceCode(QOpenGLShader.Fragment, """
varying vec3 v_normal;
void main() {
float light = dot(v_normal, vec3(0.0, 0.0, 1.0));
gl_FragColor = vec4(light, light, light, 1.0);
}
""")
self.program.link()
self.vertices = [
(0.0, 0.0, 0.0),
(0.0, 0.5, 0.0),
(0.0, 0.5, 0.1),
(0.0, 0.0, 0.1),
(0.1, 0.0, 0.0),
(0.1, 0.5, 0.0),
(0.1, 0.5, 0.1),
(0.1, 0.0, 0.1),
]
self.indices = [
0, 1, 2,
0, 2, 3,
0, 4, 5,
0, 5, 1,
1, 5, 6,
1, 6, 2,
2, 6, 7,
2, 7, 3,
3, 7, 4,
3, 4, 0,
4, 5, 6,
4, 6, 7,
]
self.normals = [
(0.0, 0.0, -1.0),
(0.0, 0.0, 1.0),
(-1.0, 0.0, 0.0),
(1.0, 0.0, 0.0),
(0.0, -1.0, 0.0),
(0.0, 1.0, 0.0),
]
self.vbo = self.gl.glGenBuffers(1)
self.gl.glBindBuffer(self.gl.GL_ARRAY_BUFFER, self.vbo)
vertices = []
for i in range(8):
vertices.extend(self.vertices[i])
vertices.extend(self.normals[i // 2])
self.gl.glBufferData(self.gl.GL_ARRAY_BUFFER, len(vertices) * 4, vertices, self.gl.GL_STATIC_DRAW)
self.ibo = self.gl.glGenBuffers(1)
self.gl.glBindBuffer(self.gl.GL_ELEMENT_ARRAY_BUFFER, self.ibo)
self.gl.glBufferData(self.gl.GL_ELEMENT_ARRAY_BUFFER, len(self.indices) * 4, self.indices, self.gl.GL_STATIC_DRAW)
self.gl.glEnable(self.gl.GL_DEPTH_TEST)
def resizeGL(self, width, height):
aspect = width / height
self.projection = QMatrix4x4()
self.projection.perspective(45.0, aspect, 0.01, 100.0)
def paintGL(self):
self.gl.glClear(self.gl.GL_COLOR_BUFFER_BIT | self.gl.GL_DEPTH_BUFFER_BIT)
self.gl.glUseProgram(self.program.programId())
self.gl.glBindBuffer(self.gl.GL_ARRAY_BUFFER, self.vbo)
self.gl.glEnableVertexAttribArray(0)
self.gl.glVertexAttribPointer(0, 3, self.gl.GL_FLOAT, False, 24, None)
self.gl.glEnableVertexAttribArray(1)
self.gl.glVertexAttribPointer(1, 3, self.gl.GL_FLOAT, False, 24, b"12")
model = QMatrix4x4()
model.rotate(self.angle, 0.0, 0.0, 1.0)
view = QMatrix4x4()
view.translate(0.0, 0.0, -1.0)
mvp = self.projection @ view @ model
loc = self.program.uniformLocation("u_mvp_matrix")
self.gl.glUniformMatrix4fv(loc, 1, False, mvp.data())
self.gl.glBindBuffer(self.gl.GL_ELEMENT_ARRAY_BUFFER, self.ibo)
self.gl.glDrawElements(self.gl.GL_TRIANGLES, len(self.indices), self.gl.GL_UNSIGNED_INT, None)
self.gl.glDisableVertexAttribArray(0)
self.gl.glDisableVertexAttribArray(1)
self.angle += 0.5
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.setWindowTitle("Speedometer")
self.setCentralWidget(Speedometer())
self.resize(640, 480)
app = QApplication([])
window = MainWindow()
window.show()
app.exec_()
```
这个示例程序使用OpenGL实现了一个简单的立方体,并且使用旋转使其具有了动态效果。您可以根据需要修改它来实现您自己的三维效果速度表盘。
相关推荐
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)