def main(): """ create a window, add scene objects, then run rendering loop """ viewer = Viewer() # place instances of our basic objects # phi, theta, psi = 30, 20, 40 # # construct our robot arm hierarchy for drawing in viewer cylinder = Cylinder(40) # re-use same cylinder instance limb_shape = Node(transform=scale(1 / 4, 1 / 4, 5)) # make a thin cylinder limb_shape.add(cylinder) # common shape of arm and forearm rotate2 = RotationControlNode(glfw.KEY_E, glfw.KEY_D, (1, 0, 0)) rotate2.add(limb_shape) forearm_node = Node(transform=translate(0, 0, 5 - 1 / 4) @ rotate( (1, 0, 0), psi)) # robot arm rotation with phi angle forearm_node.add(rotate2) arm_node = Node(transform=translate(0, 0, 0.5) @ rotate( (1, 0, 0), phi)) # robot arm rotation with phi angle arm_node.add(limb_shape, forearm_node) rotate1 = RotationControlNode(glfw.KEY_F, glfw.KEY_S, (1, 0, 0)) rotate1.add(arm_node) # make a flat cylinder base_shape = Node(transform=identity(), children=[cylinder]) # viewer.add(base_node) viewer.add(TexturedPlane("control/arrows.png")) # viewer.add(Cylinder(200)) translate_keys = {0: vec(0, 0, 0), 2: vec(1, 1, 0), 4: vec(0, 0, 0)} rotate_keys = { 0: quaternion(), 2: quaternion_from_euler(180, 45, 90), 3: quaternion_from_euler(180, 0, 180), 4: quaternion() } scale_keys = {0: 1, 2: 0.5, 4: 1} # keynode = KeyFrameControlNode(translate_keys, rotate_keys, scale_keys) base_node = KeyFrameControlNode(translate_keys, rotate_keys, scale_keys) base_node.add(base_shape, rotate1) viewer.add(base_node) # meshes = load_textured("cube/cube/cube.obj") # meshes = load("suzanne.obj") # for m in meshes: # keynode.add(m) # viewer.add(keynode) # start rendering loop viewer.run()
def main(): """ create a window, add scene objects, then run rendering loop """ viewer = Viewer() shader = Shader("color.vert", "color.frag") translate_keys = {0: vec(0, 0, 0), 2: vec(1, 1, 0), 4: vec(0, 0, 0)} rotate_keys = {0: quaternion(), 2: quaternion_from_euler(180, 45, 90), 3: quaternion_from_euler(180, 0, 180), 4: quaternion()} scale_keys = {0: 1, 2: 0.5, 4: 1} keynode = KeyFrameControlNode(translate_keys, rotate_keys, scale_keys) keynode.add(Cylinder(shader)) viewer.add(keynode) # start rendering loop viewer.run()
def __init__(self, sections=11, quarters=20, **params): # this "arm" node and its transform serves as control node for bone 0 # we give it the default identity keyframe transform, doesn't move super().__init__({0: (0, 0, 0)}, {0: quaternion()}, {0: 1}, **params) # we add a son "forearm" node with animated rotation for the second # part of the cylinder self.add(SkinningControlNode( {0: (0, 0, 0)}, {0: quaternion(), 2: quaternion_from_euler(90), 4: quaternion()}, {0: 1})) # there are two bones in this animation corresponding to above noes bone_nodes = [self, self.children[0]] # these bones have no particular offset transform bone_offsets = [identity(), identity()] # vertices, per vertex bone_ids and weights vertices, faces, bone_id, bone_weights = [], [], [], [] for x_c in range(sections+1): for angle in range(quarters): # compute vertex coordinates sampled on a cylinder z_c, y_c = sincos(360 * angle / quarters) vertices.append((x_c - sections/2, y_c, z_c)) # the index of the 4 prominent bones influencing this vertex. # since in this example there are only 2 bones, every vertex # is influenced by the two only bones 0 and 1 bone_id.append((0, 1, 0, 0)) # per-vertex weights for the 4 most influential bones given in # a vec4 vertex attribute. Not using indices 2 & 3 => 0 weight # vertex weight is currently a hard transition in the middle # of the cylinder # TODO: modify weights here for TP7 exercise 2 weight = 1 if x_c <= sections/2 else 0 bone_weights.append((weight, 1 - weight, 0, 0)) # face indices faces = [] for x_c in range(sections): for angle in range(quarters): # indices of the 4 vertices of the current quad, % helps # wrapping to finish the circle sections ir0c0 = x_c * quarters + angle ir1c0 = (x_c + 1) * quarters + angle ir0c1 = x_c * quarters + (angle + 1) % quarters ir1c1 = (x_c + 1) * quarters + (angle + 1) % quarters # add the 2 corresponding triangles per quad on the cylinder faces.extend([(ir0c0, ir0c1, ir1c1), (ir0c0, ir1c1, ir1c0)]) # the skinned mesh itself. it doesn't matter where in the hierarchy # this is added as long as it has the proper bone_node table self.add(SkinnedMesh([vertices, bone_weights, bone_id, bone_weights], bone_nodes, bone_offsets, faces))
def main(): """ main program """ viewer = Viewer() translate_keys = {0: vec(0, 0, 0), 2: vec(1, 1, 0), 4: vec(0, 0, 0)} rotate_keys = { 0: quaternion(), 2: quaternion_from_euler(180, 45, 90), 3: quaternion_from_euler(180, 0, 180), 4: quaternion() } scale_keys = {0: vec(1, 1, 1), 2: vec(0.5, 0.5, 0.5), 4: vec(1, 1, 1)} keynode = KeyFrameControlNode(translate_keys, rotate_keys, scale_keys) keynode.add(Cylinder()) viewer.add(keynode) viewer.run()
def add_asteroid(): a_mesh = PhongMesh('resources/Asteroid/10464_Asteroid_v1_Iterations-2.obj') asteroid_base = Node( transform=translate(x=2.2, y=4, z=-10) @ scale(x=0.02)) asteroid_base.add(a_mesh) translate_keys = { 0: vec(2, 5, -11), 2: vec(1.5, 3.5, -12), 4: vec(1, 2, -13), 6: vec(0.5, 0.5, -14), 8: vec(0, -1, -15), 10: vec(-0.2, -2.5, -16), } rotate_keys = { 0: quaternion_from_euler(30, 0, 150), 2: quaternion_from_euler(45, 0, 200), 4: quaternion_from_euler(50, 0, 250), 6: quaternion_from_euler(55, 0, 300), 8: quaternion_from_euler(60, 0, 350), 10: quaternion_from_euler(65, 0, 400) } scale_keys = {0: 0.1, 2: 0.08, 4: 0.06, 6: 0.04, 8: 0.01, 10: 0.001} keynode = KeyFrameControlNode(translate_keys, rotate_keys, scale_keys) keynode.add(asteroid_base) return keynode
# viewer.add(TexturedPlane("grass.png")) # construct our robot arm hierarchy for drawing in viewer # cylinder = Cylinder() # re-use same cylinder instance # limb_shape = Node(transform=identity() @ translate(0, 1, 0) @ scale(0.5, 1, 0.5)) # make a thin cylinder # limb_shape.add(cylinder) # common shape of arm and forearm # # arm_node = Node(transform=identity() @ translate(0, 2, 0) @ scale(0.7, 0.7, 0.7), children=[cylinder]) # robot arm rotation with phi angle # arm_node.add(limb_shape) # # # make a flat cylinder # base_shape = Node(transform=identity(), children=[cylinder]) # base_node = Node(transform=identity()) # robot base rotation with theta angle # base_node.add(base_shape, arm_node) # viewer.add(base_node) translate_keys = {0: vec(0, 0, 0), 2: vec(1, 1, 0), 4: vec(0, 0, 0)} rotate_keys = {0: quaternion(), 2: quaternion_from_euler(180, 45, 90), 3: quaternion_from_euler(180, 0, 180), 4: quaternion()} scale_keys = {0: vec(1,1,1), 2: vec(0.5,0.5,0.5), 4: vec(1,1,1)} keynode = KeyFrameControlNode(translate_keys, rotate_keys, scale_keys) keynode.add(Cylinder()) viewer.add(keynode) viewer.run() if __name__ == '__main__': glfw.init() # initialize window system glfw main() # main function keeps variables locally scoped glfw.terminate() # destroy all glfw windows and GL contexts
def get_rotate_keys(self): # choose rotation keys based on anti-clockwise/clockwise rotate_keys_anticlockwise = { 0: quaternion(), 2 * self.timeskip - 0.2: quaternion(), 2 * self.timeskip: quaternion_from_euler(0, 90, 0), 3 * self.timeskip - 0.2: quaternion_from_euler(0, 90, 0), 3 * self.timeskip: quaternion_from_euler(0, 180, 0), 4 * self.timeskip - 0.2: quaternion_from_euler(0, 180, 0), 4 * self.timeskip: quaternion_from_euler(0, 270, 0), 5 * self.timeskip - 0.2: quaternion_from_euler(0, 270, 0), 5 * self.timeskip: quaternion() } rotate_keys_clockwise = { 0: quaternion_from_euler(0, 180, 0), 2 * self.timeskip - 0.2: quaternion_from_euler(0, 180, 0), 2 * self.timeskip: quaternion_from_euler(0, 270, 0), 3 * self.timeskip - 0.2: quaternion_from_euler(0, 270, 0), 3 * self.timeskip: quaternion(), 14 * self.timeskip - 0.2: quaternion(), 4 * self.timeskip: quaternion_from_euler(0, 90, 0), 5 * self.timeskip - 0.2: quaternion_from_euler(0, 90, 0), 5 * self.timeskip: quaternion_from_euler(0, 180, 0) } if (self.direction == 1): return rotate_keys_anticlockwise else: return rotate_keys_clockwise
def add_ufo_ship(): ufo_mesh = PhongMesh('resources/ufo/ufo.obj') ufo_base = Node(transform=translate(x=-0.6, y=0, z=0) @ scale(x=0.04)) ufo_base.add(ufo_mesh) translate_keys = { 0: vec(-8, 0.8, -10), 1: vec(-7, 0.7, -9), 2: vec(-6, 0.6, -8), 3: vec(-5, 0.5, -7), 4: vec(-4, 0.45, -6), 5: vec(-3, 0.38, -5), 6: vec(-2, 0.35, -4), 7: vec(-1, 0.25, -3), 8: vec(-0.3, 0.15, -2.5), 9: vec(-0.1, -0.1, -1), 10: vec(0.03, -0.25, -0.5), 11: vec(0.09, -0.44, 0.1) } rotate_keys = { 0: quaternion_from_euler(0, 0, 20), 1: quaternion_from_euler(0, 0, 20), 2: quaternion_from_euler(0, 0, 25), 3: quaternion_from_euler(0, 0, 28), 4: quaternion_from_euler(0, 0, 33), 5: quaternion_from_euler(0, 0, 35), 6: quaternion_from_euler(0, 0, 37), 7: quaternion_from_euler(0, 0, 30), 8: quaternion_from_euler(0, 0, 20), 9: quaternion_from_euler(0, 0, 15), 10: quaternion_from_euler(0, 0, 25), 11: quaternion_from_euler(0, 0, 10) } scale_keys = { 0: 0.2, 1: 0.25, 2: 0.3, 3: 0.3, 4: 0.3, 5: 0.3, 6: 0.3, 7: 0.3, 8: 0.3, 9: 0.3, 10: 0.3, 11: 0.3 } keynode = KeyFrameControlNode(translate_keys, rotate_keys, scale_keys) keynode.add(ufo_base) return keynode
def main(): """ create a window, add scene objects, then run rendering loop """ viewer = Viewer() shader = Shader("texture.vert", "texture.frag") phong_shader = Shader("phong.vert", "phong.frag") skybox_shader = Shader("skybox.vert", "skybox.frag") color_shader = Shader("color.vert", "color.frag") ground_shader = Shader("ground.vert", "ground.frag") tex_phong_shader = Shader("tex_phong.vert", "tex_phong.frag") light_dir = (0, -1, 0) skybox = Skybox(skybox_shader) sky_shape = Node(transform=scale(1000, 1000, 1000)) sky_shape.add(skybox) viewer.add(sky_shape) ground = Ground(ground_shader, "./skybox/underwater01_DN.jpg") viewer.add(ground) cube = Cube(shader, "./cube/cube.png") cube_shape = Node(transform=translate(0.3, 0.03, 10) @ scale(1, 1, 1)) cube_shape.add(cube) viewer.add(cube_shape) clown_fish = Fish(shader, "./ClownFish/ClownFish2.obj", "./ClownFish/ClownFish2_Base_Color.png") clown_fish_shape = Node(transform=translate(3, 1, 1) @ scale(1, 1, 1)) clown_fish_shape.add(clown_fish) viewer.add(clown_fish_shape) clown_anim = ProdecuralAnimationNode() clown_anim.add(clown_fish_shape) viewer.add(clown_anim) barracuda_fish = Fish(shader, "./Barracuda/Barracuda2anim.obj", "./Barracuda/Barracuda_Base Color.png") barracuda_fish_shape = Node(transform=translate(1, 2, 1) @ scale(1, 1, 1) @ rotate(vec(0, 1, 0), 90)) barracuda_fish_shape.add(barracuda_fish) translate_keys = { 0: vec(1, 1, 1), 2: vec(25, 1, 0), 3: vec(50, 0, 0), 5: vec(25, 0, 0), 7: vec(0, 0, 0) } rotate_keys = { 1: quaternion(), 4: quaternion_from_euler(0, 180, 0), 6: quaternion(0) } scale_keys = {0: 1, 2: 1, 4: 0.5} keynode = KeyFrameControlNode(translate_keys, rotate_keys, scale_keys) keynode.add(barracuda_fish_shape) viewer.add(keynode) submarine = Submarine(shader) submarine_shape = Node(transform=translate(-4, 1, 1) @ scale( 0.1, 0.1, 0.1)) # make a thin cylinder submarine_shape.add(submarine) # scaled cylinder shape submarine_rot = RotationControlNode(glfw.KEY_LEFT, glfw.KEY_RIGHT, glfw.KEY_UP, glfw.KEY_DOWN, glfw.KEY_SPACE, glfw.KEY_LEFT_SHIFT, glfw.KEY_F, vec(0, 1, 0)) submarine_rot.add(submarine_shape) viewer.add(submarine_rot) phong_fish = PhongFish(tex_phong_shader, "./Barracuda/Barracuda2anim.obj", "./Barracuda/Barracuda_Base Color.png", light_dir) phong_fish_shape = Node( transform=translate(-1, -1, -1) @ scale(0.1, 0.1, 0.1) @ rotate( (0, 1, 0), 90)) phong_fish_shape.add(phong_fish) viewer.add(phong_fish_shape) phong_fish_2 = PhongFish(tex_phong_shader, "./fish-new/fish.obj", "./fish-new/fish.jpg", light_dir) phong_fish_2_shape = Node( transform=translate(4, 1, -5) @ scale(0.05, 0.05, 0.05)) phong_fish_2_shape.add(phong_fish_2) viewer.add(phong_fish_2_shape) # diver = Diver(phong_shader, light_dir) # viewer.add(diver) # Hierarchical fishes b1 = Node(transform=translate(1, 2, 20)) b1.add(barracuda_fish) b2 = Node(transform=translate(4, 4, 23)) b2.add(barracuda_fish) b3 = Node(transform=translate(3, 3, 25)) b3.add(barracuda_fish) b_group = Node() b_group.add(b1, b2, b3) b_anim = ProdecuralAnimationNode2() b_anim.add(b_group) viewer.add(b_anim) # start rendering loop viewer.run()