Я хочу расположить цилиндр так, чтобы центр одного конца находился в (x0, y0, z0), а центр другого конца — в (x1, y1, z1), используя чистый Python API.
Я хочу добиться этого, используя Python OpenGL или любую другую библиотеку GL, но не библиотеку blender.
Моя проблема
Я искал в stackoverflow и нашел этот вопрос
But it is using blender and I don't want it
Мне нужно запустить скрипт python из командной строки или pycharm ide
Таким образом, модуль bpy не может работать вне блендера.
Я хочу функцию, подобную этому формату
cylinder_between(x1, y1, z1, x2, y2, z2, rad):
Функция должна отображать цилиндр
Пожалуйста, направь меня
2) also suggest how to clear the screen fully after drawing the cylinder
Если вы хотите использовать современный OpenGL, вам нужно сгенерировать Объект вершинного массива и написать Шейдер.
Решение с меньшим количеством строк кода состоит в использовании Устаревший 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()
См. также Немедленный режим и устаревший OpenGL
Is there any way to implement manually do pan , rotate , tilt ,move the viewport like we do in 3D modeling software using mouse (that alt+mmb )
Видеть:
@LordCommander Я удивлен, потому что я разработал (и протестировал) его с помощью Python 3.7 на Win10 x64. PyOpenGL Я установил форму Неофициальные двоичные файлы Windows для пакетов расширений Python