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

	
PyOSG Fourth Python PyOSG Sixth