Home >>
Python >> PyOSG Fifth
■PyOSGでのイベントハンドリング
★キーボードのハンドラを記述
import osg, osgDB, osgViewer, osgGA
import sys, math
# キーボードハンドラのクラス定義
class KeyboardHandler(osgGA.GUIEventHandler):
roll = 0.0
def __init__(self):
osgGA.GUIEventHandler.__init__(self)
def handle(self, ea, aa, obj, nv):
vwr = osgViewer.GUIActionAdapterToViewer(aa)
if not vwr:
return False
eventtype = ea.getEventType()
if eventtype == ea.KEYDOWN:
# キー入力として、キーコードが返される
if ea.getKey( ) == ea.KEY_Right:
self.roll = self.roll + 0.1
print( "Right pushed" )
return True
elif ea.getKey( ) == ea.KEY_Left:
self.roll = self.roll - 0.1
print( "Left pushed" )
return True
return False
def getRoll(self):
return self.roll
root = osg.Group( )
# モデルの読込み(2つ)
osgDB.setLibraryFilePathList(sys.path)
loadedModel = osgDB.readNodeFile('cessna.osg')
cowModel = osgDB.readNodeFile('cow.osg')
# モデルの配置(2つ)
node = osg.PositionAttitudeTransform( )
node.setPosition( osg.Vec3d( 0, 9, 0 ) )
node.setScale( osg.Vec3d( 0.3, 0.3, 0.3 ) )
node.addChild( cowModel )
root.addChild( node )
node1 = osg.PositionAttitudeTransform( )
node1.setPosition( osg.Vec3d( 0, 9, -9 ) )
node1.setScale( osg.Vec3d( 0.3, 0.3, 0.3 ) )
node1.addChild( loadedModel )
root.addChild( node1 )
# ビューワの設定
viewer = osgViewer.Viewer()
viewer.setSceneData( root )
viewer.addEventHandler(osgViewer.StatsHandler())
viewer.addEventHandler(osgViewer.WindowSizeHandler())
viewer.setCameraManipulator(osgGA.TrackballManipulator())
# キーボードハンドラの設定
kh = KeyboardHandler( )
viewer.addEventHandler( kh )
# アニメーションループ
viewer.realize( )
stime = 0.0
while ( not viewer.done() ):
angle = stime % (2*math.pi)
quat = osg.Quat( )
quat.makeRotate( -angle, 1, 0, 0 )
quat.makeRotate( kh.getRoll( ), 0, 1, 0 )
node1.setAttitude( quat )
node1.setPosition( osg.Vec3d( 0 ,9 - 9*math.sin(angle), -9*math.cos(angle)) )
viewer.realize( )
viewer.frame( stime )
stime += 0.01
★マウス入力と入力の座標系
import osg, osgDB, osgViewer, osgGA
import sys, math
# ルートノードの設定
root = osg.Group( )
# PositionAttitudeTransformを指定してモデルを読込む
osgDB.setLibraryFilePathList(sys.path)
cow = osgDB.readNodeFile('spaceship.osg')
pat = osg.PositionAttitudeTransform( )
quat = osg.Quat( )
pat.setAttitude( quat )
pat.addChild( cow )
root.addChild( pat )
# マウスハンドラのクラスの定義
class MouseHandler( osgGA.GUIEventHandler ):
def __init__(self):
osgGA.GUIEventHandler.__init__(self)
def handle(self, ea, aa, obj, nv):
global root
vwr = osgViewer.GUIActionAdapterToViewer(aa)
if not vwr: return False
eventtype = ea.getEventType()
if eventtype == ea.PUSH:
# 座標は画面左下をx, yの原点とした整数の座標が返される
mx = ea.getX( )
my = ea.getY( )
mx = (mx - 300) / 30.0
my = (my - 250) / 25.0
# クリックされた座標にあわせて、立方体を出現させる
box = osg.Box( osg.Vec3(mx, 0, my), 1, 1, 1 )
bb = osg.ShapeDrawable( box )
gg = osg.Geode( )
gg.addDrawable( bb )
root.addChild( gg )
return True
return False
# ビューワの設定
viewer = osgViewer.Viewer()
viewer.setSceneData(root)
viewer.addEventHandler(osgViewer.WindowSizeHandler())
viewer.setCameraManipulator(osgGA.TrackballManipulator())
# マウスハンドラの設定
mh = MouseHandler( )
viewer.addEventHandler( mh )
# アニメーションのループ
stime = 0.0
count = 0
while ( not viewer.done( ) ):
quat.makeRotate( stime, -1, 1, 1 )
pat.setAttitude( quat )
viewer.realize( )
viewer.frame( stime )
stime += 0.01
count += 1