我想使用纯Python API定位圆柱体,使其一端的中心位于(x0,y0,z0),另一端的中心位于(x1,y1,z1)。
我想使用Python OpenGL或任何其他GL库而不是Blender库实现
我的问题
我在stackoverflow中进行搜索,发现了这个问题
But it is using blender and I don't want it
我需要从命令行或pycharm ide运行python脚本
因此bpy模块无法在Blender外部工作
我想要类似这种格式的功能
cylinder_between(x1, y1, z1, x2, y2, z2, rad):
该功能必须显示一个圆柱体
请指导我
2)还建议如何在绘制完屏幕后完全清除屏幕 圆柱
答案 0 :(得分:1)
如果要使用 modern OpenGL,则必须生成一个Vertex Array Object并编写一个Shader。
使用更少的代码行的解决方案是使用Legacy OpenGL和gluCylinder
或glutSolidCylinder
。
使用此(不推荐使用的)工具集,可以绘制出几行代码的圆柱体,例如:
from OpenGL.GLUT import *
from OpenGL.GLU import *
from OpenGL.GL import *
import math
def cross(a, b):
return [a[1]*b[2]-a[2]*b[1], a[2]*b[0]-a[0]*b[2], a[0]*b[1]-a[1]*b[0]]
def cylinder_between(x1, y1, z1, x2, y2, z2, rad):
v = [x2-x1, y2-y1, z2-z1]
height = math.sqrt(v[0]*v[0] + v[1]*v[1] + v[2]*v[2])
axis = (1, 0, 0) if math.hypot(v[0], v[1]) < 0.001 else cross(v, (0, 0, 1))
angle = -math.atan2(math.hypot(v[0], v[1]), v[2])*180/math.pi
glPushMatrix()
glTranslate(x1, y1, z1)
glRotate(angle, *axis)
glutSolidCylinder(rad, height, 32, 16)
glPopMatrix()
def draw():
glMatrixMode(GL_PROJECTION)
glLoadIdentity()
gluPerspective(45, wnd_w/wnd_h, 0.1, 10)
glMatrixMode(GL_MODELVIEW)
glLoadIdentity()
gluLookAt(0, -2, 0, 0, 0, 0, 0, 0, 1)
glClearColor(0.5, 0.5, 0.5, 1.0)
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
# glEnable(GL_DEPTH_TEST)
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE) # causes wire frame
glColor(1, 1, 0.5)
cylinder_between(0.2, 0.4, -0.5, -0.2, -0.4, 0.5, 0.3)
glutSwapBuffers()
glutPostRedisplay()
wnd_w, wnd_h = 300, 300
glutInit()
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH)
glutInitWindowSize(wnd_w, wnd_h)
glutInitWindowPosition(50, 50)
glutCreateWindow("cylinder")
glutDisplayFunc(draw)
glutMainLoop()
有什么方法可以像使用鼠标(alt + mmb)在3D建模软件中那样手动平移,旋转,倾斜和移动视口
请参阅: