h3d api training part 3.3: python – h3d integration

17
H3D API Training Part 3.3: Python – H3D integration

Upload: lynette-terry

Post on 29-Dec-2015

293 views

Category:

Documents


3 download

TRANSCRIPT

Page 1: H3D API Training  Part 3.3: Python – H3D integration

H3D API Training

Part 3.3: Python – H3D integration

Page 2: H3D API Training  Part 3.3: Python – H3D integration

H3D Python Python module H3DInterface:◦ C++ module defining core H3D types (Vec2f, Vec4f, Node, etc)◦ Defining Fields and Field base class◦ Functions to create nodes and access to bindable nodes

• from H3DInterface import *

Page 3: H3D API Training  Part 3.3: Python – H3D integration

H3DInterface module H3D types in Python:◦ Node◦ Vec2f Vec2d (x, y)◦ Vec3f Vec3d (x, y, z)◦ Vec4f Vec4d (x, y, z, w)◦ Rotation (x, y, z, a)◦Quaternion (x, y, z, w)◦Matrix3f, Matrix4f, Matrix3d, Matrix4d

Page 4: H3D API Training  Part 3.3: Python – H3D integration

H3DInterface module Functions for creating new nodes from X3D◦ createX3DNodeFromURL( url ) ◦ createX3DNodeFromString( string )

Returns node and dictionary of DEFed nodes

node, dn = createX3DNodeFromString( “test.x3d” )

# Access the node with DEF-name SPHERE in test.x3d

sphere = dn[“SPHERE”]

Page 5: H3D API Training  Part 3.3: Python – H3D integration

H3DInterface module Functions for accessing bindable nodes:◦ getActiveDeviceInfo()◦ getActiveViewpoint()◦ getActiveNavigationInfo()◦ getActiveStereoInfo()◦ getActiveBackground()

Page 6: H3D API Training  Part 3.3: Python – H3D integration

H3DInterface module Scene instance access◦ getCurrentScenes() - returns a list of all currently instantiated

Scene instances. Special global fields◦ time - Python access to Scene::time◦ eventSink - Python access to Scene::eventSink

Page 7: H3D API Training  Part 3.3: Python – H3D integration

Special functions initialize()◦ Called once upon initialization

traverseSG()◦ Called once per scene graph loop

Page 8: H3D API Training  Part 3.3: Python – H3D integration

H3D Python - Using Fields

Creating field instances:◦ field_a = SFFloat()◦ field_b = SFFloat(5) #default value

Routing field instances:◦ field_a.route( field_b )

Page 9: H3D API Training  Part 3.3: Python – H3D integration

H3D Python - Using Fields Setting field values:◦ field_a.setValue( 5 )◦my_vec.setValue( Vec3f(1,2,3) )

Getting field values:◦ a = field_b.getValue()◦ b = my_vec.getValue().x

Page 10: H3D API Training  Part 3.3: Python – H3D integration

H3D Python - TypedField

Definition of new fields◦ TypedField( base, ( input type ) )◦ Logic in update() function

class MyVec3f( TypedField( SFVec3f, SFFloat ) ): def update(self, event): f = event.getValue() return Vec3f( math.cos(f),math.sin(f), 0 )

Page 11: H3D API Training  Part 3.3: Python – H3D integration

H3D Python - X3D Files Can load up external X3D files using the function

createX3DFromURL() Returns a group node containing the nodes loaded and

a dictionary with the DEFed nodes.

Page 12: H3D API Training  Part 3.3: Python – H3D integration

H3D Python - Sphere.x3d<Group> <Shape> <Appearance> <Material DEF=”MATERIAL” /> </Appearance> <Sphere radius=”0.1” /> </Shape> <PythonScript DEF=”PS” url=”sphere.py” /> <MouseSensor DEF=”MS” /> <ROUTE fromNode=”MS” fromField=”leftButton” toNode=”PS” toField=”color” /> <ROUTE fromNode=”PS” fromField=”color” toNode=”MATERIAL” toField=”diffuseColor” /></Group>

Page 13: H3D API Training  Part 3.3: Python – H3D integration

H3D Python - Sphere.py

from H3DInterface import *

class Color( TypedField( SFColor, SFBool ) ): def update( self, event ): if( event.getValue() ): return RGB( 1, 0, 0 ) else: return RGB( 0, 0, 1 )

color = Color()

Page 14: H3D API Training  Part 3.3: Python – H3D integration

H3D Python – Sphere2.x3d GetRoutesIn() example<Group> <Shape> <Appearance> <Material DEF=”MATERIAL” /> </Appearance> <Sphere radius=”0.1” /> </Shape> <PythonScript DEF=”PS” url=”sphere.py” /> <MouseSensor DEF=”MS” /> <ROUTE fromNode=”MS” fromField=”leftButton” toNode=”PS” toField=”color” /> <ROUTE fromNode=”MS” fromField=”rightButton” toNode=”PS” toField=”color” /> <ROUTE fromNode=”PS” fromField=”color” toNode=”MATERIAL” toField=”diffuseColor” /></Group>

Page 15: H3D API Training  Part 3.3: Python – H3D integration

H3D Python – Sphere2.pyfrom H3DInterface import *

class Color( TypedField( SFColor, (SFBool, SFBool) ) ): def update( self, event ): routes_in = self.getRoutesIn() left_button = routes_in[0].getValue() right_button = routes_in[1].getValue() if( left_button and right_button ): return RGB( 1, 1, 0 ) elif( left_button ): return RGB( 0, 0, 1 ) elif ( right_button ): return RGB( 0, 1, 0 ) else:

return RGB( 1, 0, 0 )

color = Color()

Page 16: H3D API Training  Part 3.3: Python – H3D integration

Exercise 1 Create a program with a sphere. ◦ The color of the sphere should change from white to red

depending on how hard the user presses on it.◦ Useful fields on a in geometry nodes are the “force” and

“isTouched” fields.

Page 17: H3D API Training  Part 3.3: Python – H3D integration

Exercise 2 Create a program which handles keyboard presses. E.g.◦ Add a box to the scene when pressing “b”◦ Add a cylinder when pressing “c”◦ Change the background color when pressing “w”