2019年8月7日水曜日

pyopenglでロボットアーム作成 opengl




pyopenglでロボットアーム作成

キーで動かせる


!/usr/bin/env python
#coding:utf-8
# [2019-08-02]

#http://web.wakayama-u.ac.jp/~wuhy/GSS/07.html#7.1
#グラフィックス科学演習
#ロボットアーム
"""
@@@ ロボットアーム
@@@ スタックを使う
@@@ 質感
@@@ glMaterialfvによって 色をつける といっていいだろう
@@@ ライテイング 照明

"""

#参考サイト
#グラフィックス科学演習
#http://web.wakayama-u.ac.jp/~wuhy/GSS/01.html#1.3

from OpenGL.GL import *
from OpenGL.GLU import *
from OpenGL.GLUT import *
import sys

#adjust_r = 5
shoulder = 0
elbow    = 0
finger  = 0

vertex = [
        [0.0, 0.0, 0.0 ],
        [1.0, 0.0, 0.0 ],
        [1.0, 1.0, 0.0 ],
        [0.0, 1.0, 0.0 ],
        [1.0, 0.0, 1.0 ],
        [0.0, 0.0, 1.0 ],
        [0.0, 1.0, 1.0 ],
        [1.0, 1.0, 1.0 ]
        ]
#OpenGL では,標準では,視点から見て頂点が左回りになっているとき,
#その面を表として扱う
#頂点を視点から見て右回り(時計回り)で結んでいます
#視点からというより視点に近い立方体内部から面を見た状態でしょう
#下のfaceを有効にするならglCullFace(GL_FRONT)を有効にする
#またはglFrontFace(GL_CW)とする
face = [
        [0, 1, 2, 3],
        [1, 4, 7, 2],
        [5, 0, 3, 6],
        [4, 5, 6, 7],
        [7, 6, 3, 2],
        [1, 0, 5, 4],
        ]
#立方体6面の表面法線ベクトル
#長さ1で面を表面から外への方向
normal = [
        [0.0, 0.0, -1.0],
        [1.0, 0.0, 0.0],
        [-1.0, 0.0, 0.0],
        [0.0, 0.0, 1.0],
        [0.0, 1.0, 0.0],
        [0.0, -1.0, 0.0],
        ]
#光源設定用 4つ目の要素は1.0にする
Light0pos = [0.0, 3.0, 5.0, 1.0]
Light1pos = [5.0, 3.0, 0.0, 1.0]
red = [1.0, 0.4, 0.3, 1.0]
blue= [0.2, 0.4, 1.0, 1.0]
yellow = [1.0, 1.0, 0.0, 1.0]
orange = [0.8, 0.5, 0.0, 1.0]

#立方体を描く
def cube():
    glBegin(GL_QUADS)
    for j in range(6):
        glNormal3dv(normal[j])
        for i in range(4):
            glVertex3dv(vertex[face[j][i]])
    glEnd()

def idle():
    glutPostRedisplay()
    #プログラム中でウィンドウの再描画イベントを発生させる
    #glutTimerFunc(50 , idle , 0)

def init():
    #白で画面クリア
    glClearColor(1.0, 1.0, 1.0, 0.0)
    #glShadeModel(GL_SMOOTH) #フラットシェーディング
    glEnable(GL_DEPTH_TEST)

    glEnable(GL_CULL_FACE)#カリング
    glCullFace(GL_BACK)
    #glCullFace(GL_FRONT)
    glFrontFace(GL_CW)      #時計回りを表に設定

    ##光源の設定と物体の質感
    #ライティング処理のオン
    glEnable(GL_LIGHTING)
    #0番めの光源点灯
    glEnable(GL_LIGHT0)
    #拡散光 赤
    glLightfv(GL_LIGHT0, GL_DIFFUSE, red)
    #1番めの光源点灯
    glEnable(GL_LIGHT1)
    #拡散光 青 
    glLightfv(GL_LIGHT1, GL_DIFFUSE, blue)
    #glEnable(GL_COLOR_MATERIAL)

#resizeはウィンドウリサイズ時と最初に一回実行される
def resize(w,h):
    print "resize"
    glViewport(0,0,w,h)
    glMatrixMode(GL_PROJECTION)
    glLoadIdentity()
    #glOrtho(-w/300, w/300, -h/300, h/300, -1.0, 1.0)
    #glFrustum(-3.0, 3.0, -3.0, 3.0, 5.0, 10000.0)
    #gluPerspective(20.0, w/h, 1.0, 10.0) 
    gluPerspective(75.0, w/h, 1.0, 20.0)
    #glTranslated(0.0, 0.0, -5.0)
    glMatrixMode(GL_MODELVIEW)
    glLoadIdentity()
    #glTranslated(0.0, 0.0, -5.0 )
    gluLookAt(3.0, 4.0, 5.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0)
    #gluLookAt(9.0, 4.0, 5.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0)

"""
の時に注意が必要なのはOpenGLの特徴として描画メソッドに近い方から設定
されるという特性があります。 ですので順番としては 移動 -> 回転 -> 拡大
縮小 ですので
glTranslatef();
glRotatef();
glScalef();
の順に行う
"""
def display():
    print "display"
    global shoulder
    global elbow
    global finger1
    global finger2

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
    #glLoadIdentity()
    #gluLookAt(3.0, 4.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0)
    #gluLookAt(3.0, 4.0, -5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0)

    #光源の位置設定
    glLightfv(GL_LIGHT0, GL_POSITION, Light0pos)
    glLightfv(GL_LIGHT1, GL_POSITION, Light1pos)

    #肩から指先までの動き
    glPushMatrix()
    glRotatef(shoulder, 0.0, 0.0, 1.0)

    #肩から肱までの描画
    glPushMatrix()
    #*glScalef*各引数縮小率を表す。多分各要素の最小頂点を起点と
    #してそれぞれの要素の縮小率をかけたものになる.
    glScalef(2.0, 0.4, 1.0)
    #glScalef(1.0, 1.0, 1.0)
    glMaterialfv(GL_FRONT, GL_DIFFUSE, yellow)
    cube()
    glPopMatrix()

    #肱より指先までの動き
    glPushMatrix()
    glTranslated(2.0, 0.0, 0.0)
    glRotatef(elbow, 0.0, 0.0, 1.0)

    #肱から手首までの描画
    glPushMatrix()
    glMaterialfv(GL_FRONT, GL_DIFFUSE, orange)
    glScalef(2.0, 0.4, 1.0)
    #glScalef(1.0, 1.0, 2.0)
    cube()
    glPopMatrix()


    index = 0
    for f in range(3):
        #指1より先の動き
        glPushMatrix()
        glTranslated(2.0, 0.0, 0.4*index)
        glRotatef(finger, 0.0, 0.0, 1.0)

        #指1の描画
        glPushMatrix()
        glMaterialfv(GL_FRONT, GL_DIFFUSE, red)
        glScalef(0.4, 0.2, 0.2)
        cube()
        glPopMatrix()

        #指2の動き
        glPushMatrix()
        glTranslated(0.4, 0.0, 0.0)
        glRotatef(finger, 0.0, 0.0, 1.0)

        #指2の描画
        glPushMatrix()
        glMaterialfv(GL_FRONT, GL_DIFFUSE, blue)
        glScalef(0.4, 0.2, 0.2)
        cube()
        glPopMatrix()

        glPopMatrix()#指2の動きを取り出す
        glPopMatrix()#指1より先の動きを取り出す

        index += 1




    glPopMatrix()#肱より先の動きを取り出す
    glPopMatrix()#肩より先の動きを取り出す

    glutSwapBuffers()
    #glFlush()


def keyboard(key, x, y):
    global shoulder
    global elbow
    global finger
    if key == 'q' or key == 'Q':
        sys.exit()
    #肩より指先までが反時計回り5度回転
    if key == 's':
        shoulder = (shoulder + 5) % 360
        glutPostRedisplay()
    #肩より指先までが時計回り5度回転
    if key == 'S':
        shoulder = (shoulder - 5) % 360
        glutPostRedisplay()
    #肱より指先までが反時計回り5度回転
    if key == 'e':
        elbow = (elbow + 5)
        print "elbow",elbow
        if elbow >= 180:
            elbow = 180
        glutPostRedisplay()
    #肱より指先までが時計回り5度回転
    if key == 'E':
        #pythonでは -5%360=355 となる
        #elbow = (elbow - 5) % 360
        elbow = (elbow - 5)
        print "elbow",elbow
        if elbow <= -180:
            elbow = -180
        glutPostRedisplay()

    #指1,2が反時計回り5度回転
    if key == 'f':
        finger = (finger + 3)
        if finger >= 180:
            finger = 180
        glutPostRedisplay()
    #指1,2が時計回り5度回転
    if key == 'F':
        #pythonでは -5%360=355 となる
        #finger = (finger - 5) % 360
        finger = (finger - 3)
        if finger <= -180:
            finger = -180
        glutPostRedisplay()

def main():
    glutInit(sys.argv)
    glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH)
    #glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE)
    #glutInitDisplayMode(GLUT_RGBA)
    glutInitWindowSize(300, 300)
    glutInitWindowPosition(200, 50)
    glutCreateWindow("照明")
    init()
    glutDisplayFunc(display)

    glutReshapeFunc(resize)
    #glutTimerFunc(5 , idle , 0)
    glutKeyboardFunc(keyboard)
    #glutMouseFunc(mouse)
    #特殊なキーの入力を受け付ける
    #*glutSpecialFunc*
    #glutSpecialFunc(special_key)
    glutMainLoop()

if __name__ == "__main__":
    main()

                                                         

0 件のコメント:

コメントを投稿

About

参加ユーザー

連絡フォーム

名前

メール *

メッセージ *

ブログ アーカイブ

ページ

Featured Posts