class Mover(avango.script.Script): ## output field sf_mat = avango.gua.SFMatrix4() ## constructor def __init__(self): self.super(Mover).__init__() def my_constructor(self, SCENEGRAPH=None, START_MATRIX=avango.gua.make_identity_mat(), VIEWER=None): ## init internal classes self.input = KeyboardInput() self.input.my_constructor(VIEWER=VIEWER) self.accumulator = Accumulator() self.accumulator.my_constructor(START_MATRIX=START_MATRIX) self.groundFollowing = GroundFollowing() self.groundFollowing.my_constructor(SCENEGRAPH=SCENEGRAPH, START_MATRIX=START_MATRIX) ## init field connections self.accumulator.sf_move_vec.connect_from( self.input.sf_move_vec) # connect input into accumulator self.sf_mat.connect_from( self.accumulator.sf_mat ) # connect output of accumulator to mover output matrix
def start(): ## create scenegraph scenegraph = avango.gua.nodes.SceneGraph(Name="scenegraph") ## init viewing setup viewingSetup = SimpleViewingSetup(SCENEGRAPH=scenegraph, STEREO_MODE="mono") #viewingSetup = SimpleViewingSetup(SCENEGRAPH = scenegraph, STEREO_MODE = "anaglyph") ## init game avatar avatar = Avatar(SCENEGRAPH=scenegraph, START_MATRIX=avango.gua.make_trans_mat(0.1, 0.14, 0.0)) ## init scene scene = Scene(PARENT_NODE=scenegraph.Root.value) print_graph(scenegraph.Root.value) keyboardInput = KeyboardInput() accumulator = Accumulator() viewingSetup.navigation_node.Transform.connect_from(accumulator.sf_mat) ## init field connections (dependency graph) viewingSetup.connect_navigation_matrix( avatar.avatar_transform.Transform ) # connect avatar matrix to camera matrix viewingSetup.viewer.DesiredFPS.connect_from( avatar.input.sf_max_fps ) # change viewer FPS during runtime (enforce slow/fast frame-rate rendering) ## start application/render loop viewingSetup.run(locals(), globals())
def __init__( self, PARENT_NODE, DIAMETER=0.1, # in meter LENGTH=0.1, # in meter ROT_OFFSET_MAT=avango.gua.make_identity_mat( ), # the rotation offset relative to the parent coordinate system ): ## get unique id for this instance self.id = Arm.number_of_instances Arm.number_of_instances += 1 self.parent = PARENT_NODE ### resources ### _loader = avango.gua.nodes.TriMeshLoader( ) # get trimesh loader to load external tri-meshes self.input = KeyboardInput() self.arm_geometry = _loader.create_geometry_from_file( "arm_geometry", "data/objects/cylinder.obj", avango.gua.LoaderFlags.DEFAULTS) self.arm_geometry.Transform.value = avango.gua.make_trans_mat( 0.0, 0.0, 0.0) * avango.gua.make_scale_mat(DIAMETER, LENGTH, DIAMETER) self.arm_geometry.Material.value.set_uniform( "Color", avango.gua.Vec4(1.0, 1.0, 0.0, 1.0)) self.arm_node = avango.gua.nodes.TransformNode(Name="ArmNode") self.arm_node.Children.value.append(self.arm_geometry) PARENT_NODE.Children.value.append(self.arm_node)
def __init__(self): self.super(Hinge).__init__() ## get unique id for this instance self.id = Hinge.number_of_instances Hinge.number_of_instances += 1 self.input = KeyboardInput() self.degree = 0.0
def my_constructor( self, START_MATRIX=avango.gua.make_identity_mat(), ): ## set initial state self.sf_mat.value = START_MATRIX ## init internal sub-classes input = KeyboardInput()
def __init__( self, PARENT_NODE=None, TARGET_LIST=[], ): ## init internal sub-classes self.input = KeyboardInput() # b.Input.connect_from(a.Output) ## init base node for whole crane self.base_node = avango.gua.nodes.TransformNode(Name="base_node") self.base_node.Transform.value = \ avango.gua.make_trans_mat(.0, -.1,.0) PARENT_NODE.Children.value.append(self.base_node) # rotational axises rotAxi0 = avango.gua.Vec3(0, 1, 0) rotAxi1 = avango.gua.Vec3(0, 0, 1) # FIRST hinge0 = Hinge() hinge0.my_constructor(PARENT_NODE=self.base_node, DIAMETER=.1, HEIGHT=.01, ROT_AXIS=rotAxi0, SF_ROT_INPUT_MAT=[-180, 180]) hinge0.sf_rot_value.connect_from(self.input.sf_rot_input0) arm0 = Arm(hinge0.matrix, .01, .1) # SECOND hinge1 = Hinge() hinge1.my_constructor(PARENT_NODE=hinge0.matrix, DIAMETER=.02, HEIGHT=.01, ROT_OFFSET_MAT=avango.gua.make_trans_mat( .0, arm0.length, .0), ROT_AXIS=rotAxi1, SF_ROT_INPUT_MAT=[0, 90]) hinge1.sf_rot_value.connect_from(self.input.sf_rot_input1) arm1 = Arm(hinge1.matrix, .005, .08) # THIRD hinge2 = Hinge() hinge2.my_constructor(PARENT_NODE=hinge1.matrix, DIAMETER=.02, HEIGHT=.01, ROT_OFFSET_MAT=avango.gua.make_trans_mat( .0, arm1.length, .0), ROT_AXIS=rotAxi1, SF_ROT_INPUT_MAT=[-90, 90]) hinge2.sf_rot_value.connect_from(self.input.sf_rot_input2) arm2 = Arm(hinge2.matrix, .005, .08) # FOURTH hook = Hook() hook.rot_mat = avango.gua.make_trans_mat(.0, arm2.length, .0) hook.my_constructor(hinge2.matrix, .02, TARGET_LIST) hinge0.hook = hook hinge1.hook = hook hinge2.hook = hook
def __init__( self, SCENEGRAPH=None, START_MATRIX=avango.gua.make_identity_mat(), ): self.translation_factor = 0.01 ### resources ### _loader = avango.gua.nodes.TriMeshLoader( ) # init trimesh loader to load external meshes ## init avatar nodes self.avatar_geometry = _loader.create_geometry_from_file( "avatar_geometry", "data/objects/monkey.obj", avango.gua.LoaderFlags.DEFAULTS) self.avatar_geometry.Transform.value = avango.gua.make_scale_mat(0.03) self.avatar_geometry.Material.value.set_uniform( "Color", avango.gua.Vec4(1.0, 0.2, 0.2, 1.0)) self.avatar_transform = avango.gua.nodes.TransformNode( Name="avatar_node") self.avatar_transform.Children.value = [self.avatar_geometry] SCENEGRAPH.Root.value.Children.value.append(self.avatar_transform) ## init internal sub-classes self.input = KeyboardInput() self.accumulator = Accumulator() self.accumulator.my_constructor(START_MATRIX=START_MATRIX) self.groundFollowing = GroundFollowing() self.groundFollowing.my_constructor(SCENEGRAPH=SCENEGRAPH, START_MATRIX=START_MATRIX) ## init field connections (dependency graph) self.accumulator.sf_move_vec.connect_from( self.input.sf_move_vec ) # propagate movement vector into movement accumulator self.avatar_transform.Transform.connect_from( self.accumulator.sf_mat ) # connect final movement matrix to avatar node matrix
def __init__(self, PARENT_NODE = None, TARGET_LIST = [], ): self.rotation = 0.0 self.world_pos = (0,0,0) ### resources ### ## init base node for whole crane self.base_node = avango.gua.nodes.TransformNode(Name = "base_node") self.base_node.Transform.value = avango.gua.make_trans_mat(0.0,-0.1,0.0) PARENT_NODE.Children.value.append(self.base_node) self.targets = TARGET_LIST ## init internal sub-classes self.input = KeyboardInput() ## ToDo: init first hinge && connect rotation input # ... #self.sf_rotation.connect_from(self.input.sf_rot_value1) self.firsthinge = Hinge() self.firsthinge.my_constructor( PARENT_NODE = self.base_node, DIAMETER = 0.05, # in meter HEIGHT = 0.01, # in meter ROT_OFFSET_MAT = avango.gua.make_identity_mat(), # the rotation offset relative to the parent coordinate system ROT_AXIS = avango.gua.Vec3(0,1,0), # the axis to rotate arround with the rotation input (default is head axis) ROT_CONSTRAINT = [-180.0, 180.0], # intervall with min and max rotation of this hinge BASE = True ) self.firsthhinge_node = self.firsthinge.get_hinge_node() ## ToDo: init first arm-segment # ... self.firstarm = Arm( PARENT_NODE = self.firsthhinge_node, DIAMETER = 0.005, # in meter LENGTH = 0.075, # in meter ROT_OFFSET_MAT = avango.gua.make_identity_mat(), # the rotation offset relative to the parent coordinate system ) self.firstarm_node = self.firstarm.get_arm_node() self.firstarm_node.Transform.value = avango.gua.make_trans_mat(0,0.04,0) ## ToDo: init second hinge && connect rotation input # ... self.secondhinge = Hinge() self.secondhinge.my_constructor( PARENT_NODE = self.firstarm_node, DIAMETER = 0.02, # in meter HEIGHT = 0.02, # in meter ROT_OFFSET_MAT = avango.gua.make_identity_mat(), # the rotation offset relative to the parent coordinate system ROT_AXIS = avango.gua.Vec3(0,0,1), # the axis to rotate arround with the rotation input (default is head axis) ROT_CONSTRAINT = [-0.0, 90.0], # intervall with min and max rotation of this hinge ) self.secondhinge_node = self.secondhinge.get_hinge_node() self.secondhinge_node.Transform.value = avango.gua.make_trans_mat(0,0.04,0) ## ToDo: init second arm-segment # ... self.secondarm = Arm( PARENT_NODE = self.secondhinge_node, DIAMETER = 0.005, # in meter LENGTH = 0.075, # in meter ROT_OFFSET_MAT = avango.gua.make_identity_mat(), # the rotation offset relative to the parent coordinate system ) self.secondarm_node = self.secondarm.get_arm_node() self.secondarm_node.Transform.value = avango.gua.make_trans_mat(0,0.04,0) ## ToDo: init third hinge && connect rotation input # ... self.thirdhinge = Hinge() self.thirdhinge.my_constructor( PARENT_NODE = self.secondarm_node, DIAMETER = 0.02, # in meter HEIGHT = 0.02, # in meter ROT_OFFSET_MAT = avango.gua.make_identity_mat(), # the rotation offset relative to the parent coordinate system ROT_AXIS = avango.gua.Vec3(0,0,1), # the axis to rotate arround with the rotation input (default is head axis) ROT_CONSTRAINT = [-90.0, 90.0], # intervall with min and max rotation of this hinge ) self.thirdhinge_node = self.thirdhinge.get_hinge_node() self.thirdhinge_node.Transform.value = avango.gua.make_trans_mat(0,0.04,0) ## ToDo: init third arm-segment # ... self.thirdarm = Arm( PARENT_NODE = self.thirdhinge_node, DIAMETER = 0.005, # in meter LENGTH = 0.075, # in meter ROT_OFFSET_MAT = avango.gua.make_identity_mat(), # the rotation offset relative to the parent coordinate system ) self.thirdarm_node = self.thirdarm.get_arm_node() self.thirdarm_node.Transform.value = avango.gua.make_trans_mat(0,0.04,0) ## ToDo: init hook self.firsthook = Hook() self.firsthook.my_constructor( PARENT_NODE = self.thirdarm_node, SIZE = 0.03, TARGET_LIST = self.targets, #TARGET_LIST = [] ) self.firsthook_node = self.firsthook.get_hook_node() self.firsthook_node.Transform.value = avango.gua.make_trans_mat(0,0.045,0)
def __init__(self, PARENT_NODE = None, TARGET_LIST = [], ): ### resources ### ## init base node for whole crane self.base_node = avango.gua.nodes.TransformNode(Name = "base_node") self.base_node.Transform.value = avango.gua.make_trans_mat(0.0,-0.1,0.0) PARENT_NODE.Children.value.append(self.base_node) ## init internal sub-classes self.input = KeyboardInput() ## ToDo: init first hinge && connect rotation input self.hinge1 = Hinge() self.hinge1.my_constructor(PARENT_NODE = self.base_node, DIAMETER = 0.1, HEIGHT = 0.01, \ ROT_OFFSET_MAT = avango.gua.make_identity_mat(), ROT_AXIS = avango.gua.Vec3(0,1,0), \ ROT_CONSTRAINT = [-180.0, 180.0]) self.hinge1.sf_rot_value.connect_from(self.input.sf_rot_value0) #self.hinge1.connect_from(self.KeyboardInput.Button1) ## ToDo: init first arm-segment # ... self.arm1 = Arm(PARENT_NODE = self.hinge1.get_hinge_transform_node(), DIAMETER = 0.01, LENGTH = 0.1, ROT_OFFSET_MAT = avango.gua.make_identity_mat()) ## ToDo: init second hinge && connect rotation input # ... self.hinge2 = Hinge() self.hinge2.my_constructor(PARENT_NODE = self.hinge1.get_hinge_transform_node(), DIAMETER = 0.02, HEIGHT = 0.01, \ ROT_OFFSET_MAT = avango.gua.make_rot_mat(90, 1, 0, 0), ROT_AXIS = avango.gua.Vec3(0,0,1), \ ROT_CONSTRAINT = [0.0, 90.0], TRANS_OFFSET = self.arm1.length) self.hinge2.sf_rot_value.connect_from(self.input.sf_rot_value1) # # ## ToDo: init second arm-segment # # # ... self.arm2 = Arm(PARENT_NODE = self.hinge2.get_hinge_transform_node(), DIAMETER = 0.01, LENGTH = 0.1, ROT_OFFSET_MAT = avango.gua.make_identity_mat()) # # ## ToDo: init third hinge && connect rotation input # # # ... self.hinge3 = Hinge() self.hinge3.my_constructor(PARENT_NODE = self.hinge2.get_hinge_transform_node(), DIAMETER = 0.02, HEIGHT = 0.01, \ ROT_OFFSET_MAT = avango.gua.make_rot_mat(90, 1, 0, 0), ROT_AXIS = avango.gua.Vec3(0,0,1), \ ROT_CONSTRAINT = [-90.0, 90.0], TRANS_OFFSET = self.arm2.length) self.hinge3.sf_rot_value.connect_from(self.input.sf_rot_value2) # # ## ToDo: init third arm-segment # # # ... self.arm3 = Arm(PARENT_NODE = self.hinge3.get_hinge_transform_node(), DIAMETER = 0.01, LENGTH = 0.1, ROT_OFFSET_MAT = avango.gua.make_identity_mat()) # # ## ToDo: init hook # # # ... self.hook = Hook() self.hook.my_constructor(PARENT_NODE = self.hinge3.get_hinge_transform_node(), SIZE = 0.025, TARGET_LIST = TARGET_LIST, OFFSET = self.arm3.length) self.hook.sf_mat.connect_from(self.hook.hook_geometry.WorldTransform)
def __init__( self, PARENT_NODE=None, TARGET_LIST=[], # required for bounding box intersection in Hook class ): ## init base node for whole crane self.base_node = avango.gua.nodes.TransformNode(Name="base_node") self.base_node.Transform.value = avango.gua.make_trans_mat( 0.0, -0.1, 0.0) PARENT_NODE.Children.value.append(self.base_node) ## init internal sub-classes self.input = KeyboardInput() ## first hinge self.hinge0 = Hinge( PARENT_NODE=self.base_node, DIAMETER=0.1, HEIGHT=0.01, ROT_OFFSET_MAT=avango.gua.make_identity_mat(), SF_ROT_INPUT=self.input.sf_rot_input0, ) ## first arm segment self.arm0 = Arm( PARENT_NODE=self.hinge0.hinge_node, LENGTH=0.12, DIAMETER=0.01, ROT_OFFSET_MAT=avango.gua.make_identity_mat(), ) ## second hinge self.hinge1 = Hinge( PARENT_NODE=self.arm0.arm_end_node, DIAMETER=0.04, HEIGHT=0.01, ROT_OFFSET_MAT=avango.gua.make_rot_mat(90.0, 1, 0, 0), SF_ROT_INPUT=self.input.sf_rot_input1, MIN_ANGLE=-45, MAX_ANGLE=45, ) ## second arm segment self.arm1 = Arm( PARENT_NODE=self.hinge1.hinge_node, LENGTH=0.09, DIAMETER=0.007, ROT_OFFSET_MAT=avango.gua.make_rot_mat(45.0, 0, 1, 0) * avango.gua.make_rot_mat(-90.0, 1, 0, 0), ) ## third hinge self.hinge2 = Hinge( PARENT_NODE=self.arm1.arm_end_node, DIAMETER=0.03, HEIGHT=0.01, ROT_OFFSET_MAT=avango.gua.make_rot_mat(90.0, 1, 0, 0), SF_ROT_INPUT=self.input.sf_rot_input2, MIN_ANGLE=-135, MAX_ANGLE=45, ) ## third arm segment self.arm3 = Arm( PARENT_NODE=self.hinge2.hinge_node, LENGTH=0.07, DIAMETER=0.007, ROT_OFFSET_MAT=avango.gua.make_rot_mat(45.0, 0, 1, 0) * avango.gua.make_rot_mat(-90.0, 1, 0, 0), ) ## Hook self.hook = Hook() self.hook.my_constructor( PARENT_NODE=self.arm3.arm_end_node, SIZE=0.02, TARGET_LIST=TARGET_LIST, )