2022/09/15(木) [n年前の日記]
#1 [python] PyOpenGLで球を描画
Windows10 x64 21H2 + Python 3.9.13 64bit + PyOpenGL 3.1.6 で球を描画できるか実験。
結果画面は以下。
結果画面は以下。
◎ ソース。 :
ソースは以下。
_01_draw_sphere.py
python 01_draw_sphere.py で実行。
球の描画は何を使うのかググってみたところ、gluSphere() が使えるっぽい。
_01_draw_sphere.py
import sys
import math
from OpenGL.GL import *
from OpenGL.GLU import *
from OpenGL.GLUT import *
# SCRW, SCRH = 1280, 720
SCRW, SCRH = 512, 288
FPS = 60
ang = 0.0
window = 0
def draw_func():
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
# set light
glDisable(GL_LIGHTING)
glEnable(GL_LIGHTING)
glEnable(GL_NORMALIZE)
glLightfv(GL_LIGHT0, GL_POSITION, [0.25, 1.0, 0.5, 0])
glLightfv(GL_LIGHT0, GL_DIFFUSE, [1, 1, 1, 1])
glLightfv(GL_LIGHT0, GL_SPECULAR, [1, 1, 1, 1])
glEnable(GL_LIGHT0)
glLoadIdentity()
# rotate camera position
r = 30
x = r * math.cos(math.radians(ang))
y = r * 0.5
z = r * math.sin(math.radians(ang))
tx, ty, tz = 0, 0, 0
gluLookAt(x, y, z, tx, ty, tz, 0, 1, 0)
glScalef(1.0, 1.0, 1.0)
# set color
green = [0.0, 1.0, 0.0, 1.0]
glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, green)
# draw sphere
quadric = gluNewQuadric()
# radius = 0.25 * math.sin(math.radians(ang * 8)) + 1.0
radius = 4 * math.sin(math.radians(ang * 8)) + 5.0
slices = 32
stacks = 16
gluSphere(quadric, radius, slices, stacks)
glDisable(GL_LIGHT0)
glDisable(GL_LIGHTING)
# set color
c = 0.5 * math.cos(math.radians(ang * 2)) + 0.5
glColor3f(0.0, c, 1.0 - c)
# glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, [0.0, 1.0, 1.0, 1.0])
# draw cube
glutWireCube(20)
glutSwapBuffers()
def init_GL():
global window
glutInit(sys.argv)
glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_ALPHA | GLUT_DEPTH)
# glutInitWindowPosition(0, 0)
glutInitWindowSize(SCRW, SCRH)
window = glutCreateWindow("Draw sphere")
glClearColor(0.0, 0.0, 0.0, 0.0)
glClearDepth(1.0)
glDepthFunc(GL_LESS)
glEnable(GL_DEPTH_TEST)
glShadeModel(GL_SMOOTH)
# glShadeModel(GL_FLAT)
glDisable(GL_LIGHTING)
glEnable(GL_LIGHTING)
glEnable(GL_NORMALIZE)
# glEnable(GL_CULL_FACE)
# glCullFace(GL_BACK)
glViewport(0, 0, SCRW, SCRH)
glMatrixMode(GL_PROJECTION)
glLoadIdentity()
gluPerspective(45, float(SCRW) / float(SCRH), 0.1, 100.0)
glMatrixMode(GL_MODELVIEW)
glLoadIdentity()
def on_timer(value):
global ang
ang += 0.5
glutPostRedisplay()
glutTimerFunc(int(1000 / FPS), on_timer, 0)
def key_func(key, x, y):
global window
ESCAPE = b"\x1b"
print("Push key,", key, x, y)
if key == ESCAPE or key == b"q":
print("Exit")
if glutLeaveMainLoop:
glutLeaveMainLoop()
else:
sys.exit()
def main():
# main
init_GL()
glutKeyboardFunc(key_func)
glutDisplayFunc(draw_func)
glutTimerFunc(int(1000 / FPS), on_timer, 0)
glutMainLoop()
if __name__ == "__main__":
main()
python 01_draw_sphere.py で実行。
球の描画は何を使うのかググってみたところ、gluSphere() が使えるっぽい。
[ ツッコむ ]
以上、1 日分です。