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()
登録:
コメントの投稿 (Atom)
About
リンク
連絡フォーム
ブログ アーカイブ
-
▼
2019
(66)
-
▼
8月
(11)
- pyopengl pyopengl ウォークスルー 視点の移動 動き回る
- opengl pyopengl glLogicOpの使い方
- opengl pyopengl jpg画像ファイルをテクスチャとして貼る
- opengl pyopengl tga画像ファイルをテクスチャで貼り付ける
- OpenGLのtgaファイルをテクスチャとして貼る
- g++コンパイルでエラー 文字列定数から「char *」への非推奨の変換
- opengl コンパイラオプション
- pyopengl opengl 四角形にチェッカー模様のテクスチャを貼り付ける2
- pyopengl opengl 四角形にチェッカー模様のテクスチャを貼り付ける
- pyopengl 立方体が2つマウス操作で回転、 チェス盤のテクスチャを立方体に貼る
- pyopenglでロボットアーム作成 opengl
-
▼
8月
(11)
0 件のコメント:
コメントを投稿