人間の動きなど関節を持った物体の動き等を,階層構造により制御する方法である.
物体それぞれの座標系を関連づける(親子関係を持たせる)ことにより,人体等の動きを再現できる.
(インバースキネマティクス(逆運動学)は手先の位置から階層を逆にたどる手法である.)
コード1 robotarm.frm
'Form1上にPicture1及びCommand1を配置する.
Dim m_hGLRC&
Dim rz As SinglePrivate Sub Form_Initialize()
Initialize
ViewSet 50, Picture1.ScaleWidth / Picture1.ScaleHeight, 1, 100
End SubPrivate Sub Picture1_Paint()
Draw
End SubPrivate Sub Command1_Click()
rz = rz + 2
Debug.Print rz
Draw
End SubPrivate Function Initialize() As Boolean
Dim pfd As PIXELFORMATDESCRIPTOR
Dim R&
Picture1.ScaleMode = vbPixels
glutInitDisplayMode GLUT_SINGLE Or GLUT_RGBA
R = ChoosePixelFormat(Picture1.hDC, pfd)
If R = 0 Then
MsgBox "ChoosePixelFormat failed"
Exit Function
End If
R = SetPixelFormat(Picture1.hDC, R, pfd)
m_hGLRC = wglCreateContext(Picture1.hDC)
wglMakeCurrent Picture1.hDC, m_hGLRC
Initialize = True
End FunctionPrivate Sub Form_Unload(Cancel As Integer)
If m_hGLRC <> 0 Then
wglMakeCurrent 0, 0
wglDeleteContext m_hGLRC
End If
End SubPrivate Sub ViewSet(fov As Single, aspect As Single, near As Single, far As Single)
glMatrixMode GL_PROJECTION
glLoadIdentity
gluPerspective fov, aspect, near, far
glViewport 0, 0, Picture1.ScaleWidth, Picture1.ScaleHeight
glMatrixMode GL_MODELVIEW
End SubPublic Sub Draw()
Dim n As Integer
glClearColor 0, 0, 0, 0
glClear GL_COLOR_BUFFER_BIT
glColor3f 1#, 1#, 1#
glLoadIdentity
glTranslatef 0#, 0#, -5#
drawAxisGlobal
glRotatef rz, 0, 0, 1
glPushMatrix
glTranslatef 0, 0.5, 0
glScalef 0.2, 1, 0.2
glutWireCube 1
glPopMatrix
drawAxis
glTranslatef 0, 1, 0
glRotatef rz, 0, 0, 1
drawAxis
glPushMatrix
glTranslatef 0, 0.5, 0
glScalef 0.2, 1, 0.2
glutWireCube 1
glPopMatrix
glFlush
End SubPublic Sub drawAxis()
glColor3f 1, 0, 0
glBegin GL_LINES
glVertex3f -1, 0, 0
glVertex3f 1, 0, 0
glEnd
glBegin GL_LINES
glVertex3f 0, -1, 0
glVertex3f 0, 1, 0
glEnd
glBegin GL_LINES
glVertex3f 0, 0, -1
glVertex3f 0, 0, 1
glEnd
glColor3f 1, 1, 1
End SubPublic Sub drawAxisGlobal()
glBegin GL_LINES
glVertex3f -10, 0, 0
glVertex3f 10, 0, 0
glEnd
glBegin GL_LINES
glVertex3f 0, -10, 0
glVertex3f 0, 10, 0
glEnd
End Sub
(問題) 1.robotarm.frmを基に,ロボットアームに対し,次の制御ができるようプログラムを改良しなさい 1)逆方向にも動く(動きを戻す)ようにする. 2)Y軸まわりの回転ができるようにする. 2.4つの関節をもつロボットアームを作成しなさい. 3.ロボットアームを応用し,自分で制御できるロボットを作成しなさい.
|
(補足)タイマーコントロールを用いたアニメーション
タイマーコントロールを用いて,ボタンを押しているときだけ動くようにするには,
以下のような方法があります.
1)タイマーコントロールを貼り付ける.(Timer1)
2)Command1_Clickサブルーチンは削除
3)以下を追加する.
Private Sub Command1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
Timer1.Enabled = True
End SubPrivate Sub Command1_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
Timer1.Enabled = False
End SubPrivate Sub Form_Load()
Timer1.Enabled = False
Timer1.Interval = 10 'タイマーの間隔をミリ秒単位で設定(実際にはミリ秒単位での精度はない)
End Sub
Private Sub Timer1_Timer()
rz = rz + 5
Draw
End Sub