def build_scene(scene: bpy.types.Scene, input_bvh_path: str) -> bpy.types.Object: loader.build_pbr_textured_nodes_from_name("Concrete07", scale=(0.25, 0.25, 0.25)) mat = utils.add_material("BlueMetal", use_nodes=True, make_node_tree_empty=True) output_node = mat.node_tree.nodes.new(type='ShaderNodeOutputMaterial') principled_node = mat.node_tree.nodes.new(type='ShaderNodeBsdfPrincipled') principled_node.inputs['Base Color'].default_value = (0.1, 0.2, 0.7, 1.0) principled_node.inputs['Metallic'].default_value = 0.9 principled_node.inputs['Roughness'].default_value = 0.1 mat.node_tree.links.new(principled_node.outputs['BSDF'], output_node.inputs['Surface']) utils.arrange_nodes(mat.node_tree) armature = create_armature_from_bvh(bvh_path=input_bvh_path) armature_mesh = utils.create_armature_mesh(scene, armature, 'Mesh') armature_mesh.data.materials.append(mat) current_object = utils.create_plane(size=16.0, name="Floor") current_object.data.materials.append(bpy.data.materials["Concrete07"]) current_object = utils.create_plane(size=16.0, name="Wall") current_object.data.materials.append(bpy.data.materials["Concrete07"]) current_object.location = (0.0, 6.0, 0.0) current_object.rotation_euler = (0.5 * math.pi, 0.0, 0.0) bpy.ops.object.empty_add(location=(0.0, 0.0, 0.8)) focus_target = bpy.context.object utils.add_copy_location_constraint(copy_to_object=focus_target, copy_from_object=armature, use_x=True, use_y=True, use_z=False, bone_name='Hips') return focus_target
def build_scene_composition(scene): scene.use_nodes = True utils.clean_nodes(scene.node_tree.nodes) render_layer_node = scene.node_tree.nodes.new(type="CompositorNodeRLayers") vignette_node = utils.create_vignette_node(scene.node_tree) vignette_node.inputs["Amount"].default_value = 0.70 lens_distortion_node = scene.node_tree.nodes.new(type="CompositorNodeLensdist") lens_distortion_node.inputs["Distort"].default_value = -0.050 lens_distortion_node.inputs["Dispersion"].default_value = 0.080 color_correction_node = scene.node_tree.nodes.new(type="CompositorNodeColorCorrection") color_correction_node.master_saturation = 1.10 color_correction_node.master_gain = 1.40 glare_node = scene.node_tree.nodes.new(type="CompositorNodeGlare") glare_node.glare_type = 'GHOSTS' glare_node.iterations = 2 glare_node.quality = 'HIGH' composite_node = scene.node_tree.nodes.new(type="CompositorNodeComposite") scene.node_tree.links.new(render_layer_node.outputs['Image'], vignette_node.inputs['Image']) scene.node_tree.links.new(vignette_node.outputs['Image'], lens_distortion_node.inputs['Image']) scene.node_tree.links.new(lens_distortion_node.outputs['Image'], color_correction_node.inputs['Image']) scene.node_tree.links.new(color_correction_node.outputs['Image'], glare_node.inputs['Image']) scene.node_tree.links.new(glare_node.outputs['Image'], composite_node.inputs['Image']) utils.arrange_nodes(scene.node_tree)
def build_matcap_nodes(node_tree, image_path): tex_coord_node = node_tree.nodes.new(type='ShaderNodeTexCoord') vector_transform_node = node_tree.nodes.new(type='ShaderNodeVectorTransform') mapping_node = node_tree.nodes.new(type='ShaderNodeMapping') texture_image_node = create_texture_node(node_tree, image_path, True) emmission_node = node_tree.nodes.new(type='ShaderNodeEmission') output_node = node_tree.nodes.new(type='ShaderNodeOutputMaterial') frame = node_tree.nodes.new(type='NodeFrame') frame.name = "MatCap UV" frame.label = "MatCap UV" tex_coord_node.parent = frame vector_transform_node.parent = frame mapping_node.parent = frame vector_transform_node.vector_type = "VECTOR" vector_transform_node.convert_from = "OBJECT" vector_transform_node.convert_to = "CAMERA" mapping_node.vector_type = "TEXTURE" mapping_node.translation = (1.0, 1.0, 0.0) mapping_node.scale = (2.0, 2.0, 1.0) node_tree.links.new(tex_coord_node.outputs['Normal'], vector_transform_node.inputs['Vector']) node_tree.links.new(vector_transform_node.outputs['Vector'], mapping_node.inputs['Vector']) node_tree.links.new(mapping_node.outputs['Vector'], texture_image_node.inputs['Vector']) node_tree.links.new(texture_image_node.outputs['Color'], emmission_node.inputs['Color']) node_tree.links.new(emmission_node.outputs['Emission'], output_node.inputs['Surface']) utils.arrange_nodes(node_tree)
def build_scene_composition(scene): scene.use_nodes = True utils.clean_nodes(scene.node_tree.nodes) render_layer_node = scene.node_tree.nodes.new(type="CompositorNodeRLayers") filter_node = scene.node_tree.nodes.new(type="CompositorNodeFilter") filter_node.filter_type = "SHARPEN" filter_node.inputs["Fac"].default_value = 0.1 color_correction_node = scene.node_tree.nodes.new( type="CompositorNodeColorCorrection") color_correction_node.master_saturation = 1.10 color_correction_node.master_gain = 1.20 color_correction_node.midtones_gain = 1.20 color_correction_node.shadows_gain = 1.50 split_tone_node = utils.create_split_tone_node(scene.node_tree) split_tone_node.inputs["ShadowsHue"].default_value = 0.6 split_tone_node.inputs["ShadowsSaturation"].default_value = 0.1 composite_node = scene.node_tree.nodes.new(type="CompositorNodeComposite") scene.node_tree.links.new(render_layer_node.outputs['Image'], filter_node.inputs['Image']) scene.node_tree.links.new(filter_node.outputs['Image'], color_correction_node.inputs['Image']) scene.node_tree.links.new(color_correction_node.outputs['Image'], split_tone_node.inputs['Image']) scene.node_tree.links.new(split_tone_node.outputs['Image'], composite_node.inputs['Image']) utils.arrange_nodes(scene.node_tree)
def build_scene(scene, input_bvh_path): mat = bpy.data.materials.new("BlueMetal") mat.use_nodes = True utils.clean_nodes(mat.node_tree.nodes) output_node = mat.node_tree.nodes.new(type='ShaderNodeOutputMaterial') principled_node = mat.node_tree.nodes.new(type='ShaderNodeBsdfPrincipled') principled_node.inputs['Base Color'].default_value = (0.1, 0.2, 0.7, 1.0) principled_node.inputs['Metallic'].default_value = 0.9 principled_node.inputs['Roughness'].default_value = 0.1 mat.node_tree.links.new(principled_node.outputs['BSDF'], output_node.inputs['Surface']) utils.arrange_nodes(mat.node_tree) armature = create_armature_from_bvh(scene, bvh_path=input_bvh_path) armature_mesh = utils.create_armature_mesh(scene, armature, 'Mesh') armature_mesh.data.materials.append(mat) mat = bpy.data.materials.new("Concrete07") mat.use_nodes = True utils.clean_nodes(mat.node_tree.nodes) utils.build_pbr_textured_nodes( mat.node_tree, color_texture_path= "./assets/textures/[2K]Concrete07/Concrete07_col.jpg", roughness_texture_path= "./assets/textures/[2K]Concrete07/Concrete07_rgh.jpg", normal_texture_path= "./assets/textures/[2K]Concrete07/Concrete07_nrm.jpg", displacement_texture_path= "./assets/textures/[2K]Concrete07/Concrete07_disp.jpg", ambient_occlusion_texture_path= "./assets/textures/[2K]Concrete07/Concrete07_AO.jpg", scale=(0.25, 0.25, 0.25)) bpy.ops.mesh.primitive_plane_add(radius=8.0, calc_uvs=True) current_object = bpy.context.object current_object.name = "Floor" current_object.data.materials.append(mat) bpy.ops.mesh.primitive_plane_add(radius=8.0, calc_uvs=True) current_object = bpy.context.object current_object.name = "Wall" current_object.data.materials.append(mat) current_object.location = (0.0, 6.0, 0.0) current_object.rotation_euler = (0.5 * math.pi, 0.0, 0.0) bpy.ops.object.empty_add(location=(0.0, 0.0, 0.8)) focus_target = bpy.context.object utils.add_copy_location_constraint(copy_to_object=focus_target, copy_from_object=armature, use_x=True, use_y=True, use_z=False, bone_name='Hips') return focus_target
def build_pbr_textured_nodes(node_tree, color_texture_path="", metallic_texture_path="", roughness_texture_path="", normal_texture_path="", displacement_texture_path="", ambient_occlusion_texture_path="", scale=(1.0, 1.0, 1.0)): output_node = node_tree.nodes.new(type='ShaderNodeOutputMaterial') principled_node = node_tree.nodes.new(type='ShaderNodeBsdfPrincipled') node_tree.links.new(principled_node.outputs['BSDF'], output_node.inputs['Surface']) coord_node = node_tree.nodes.new(type='ShaderNodeTexCoord') mapping_node = node_tree.nodes.new(type='ShaderNodeMapping') mapping_node.vector_type = 'TEXTURE' mapping_node.scale = scale node_tree.links.new(coord_node.outputs['UV'], mapping_node.inputs['Vector']) if color_texture_path != "": texture_node = create_texture_node(node_tree, color_texture_path, True) node_tree.links.new(mapping_node.outputs['Vector'], texture_node.inputs['Vector']) if ambient_occlusion_texture_path != "": ao_texture_node = create_texture_node(node_tree, ambient_occlusion_texture_path, False) node_tree.links.new(mapping_node.outputs['Vector'], ao_texture_node.inputs['Vector']) mix_node = node_tree.nodes.new(type='ShaderNodeMixRGB') mix_node.blend_type = 'MULTIPLY' node_tree.links.new(texture_node.outputs['Color'], mix_node.inputs['Color1']) node_tree.links.new(ao_texture_node.outputs['Color'], mix_node.inputs['Color2']) node_tree.links.new(mix_node.outputs['Color'], principled_node.inputs['Base Color']) else: node_tree.links.new(texture_node.outputs['Color'], principled_node.inputs['Base Color']) if metallic_texture_path != "": texture_node = create_texture_node(node_tree, metallic_texture_path, False) node_tree.links.new(mapping_node.outputs['Vector'], texture_node.inputs['Vector']) node_tree.links.new(texture_node.outputs['Color'], principled_node.inputs['Metallic']) if roughness_texture_path != "": texture_node = create_texture_node(node_tree, roughness_texture_path, False) node_tree.links.new(mapping_node.outputs['Vector'], texture_node.inputs['Vector']) node_tree.links.new(texture_node.outputs['Color'], principled_node.inputs['Roughness']) if normal_texture_path != "": texture_node = create_texture_node(node_tree, normal_texture_path, False) node_tree.links.new(mapping_node.outputs['Vector'], texture_node.inputs['Vector']) normal_map_node = node_tree.nodes.new(type='ShaderNodeNormalMap') node_tree.links.new(texture_node.outputs['Color'], normal_map_node.inputs['Color']) node_tree.links.new(normal_map_node.outputs['Normal'], principled_node.inputs['Normal']) if displacement_texture_path != "": texture_node = create_texture_node(node_tree, displacement_texture_path, False) node_tree.links.new(mapping_node.outputs['Vector'], texture_node.inputs['Vector']) node_tree.links.new(texture_node.outputs['Color'], output_node.inputs['Displacement']) utils.arrange_nodes(node_tree)
def build_checker_board_nodes(node_tree, size): output_node = node_tree.nodes.new(type='ShaderNodeOutputMaterial') principled_node = node_tree.nodes.new(type='ShaderNodeBsdfPrincipled') checker_texture_node = node_tree.nodes.new(type='ShaderNodeTexChecker') set_principled_node(principled_node=principled_node) checker_texture_node.inputs['Scale'].default_value = size node_tree.links.new(checker_texture_node.outputs['Color'], principled_node.inputs['Base Color']) node_tree.links.new(principled_node.outputs['BSDF'], output_node.inputs['Surface']) utils.arrange_nodes(node_tree)
def build_pbr_nodes(node_tree, base_color=(0.6, 0.6, 0.6, 1.0), metallic=0.0, specular=0.5, roughness=0.5, sheen=0.0): output_node = node_tree.nodes.new(type='ShaderNodeOutputMaterial') principled_node = node_tree.nodes.new(type='ShaderNodeBsdfPrincipled') node_tree.links.new(principled_node.outputs['BSDF'], output_node.inputs['Surface']) set_principled_node(principled_node=principled_node, base_color=base_color, metallic=metallic, specular=specular, roughness=roughness, sheen=sheen) utils.arrange_nodes(node_tree)
def set_scene_objects() -> bpy.types.Object: # Instantiate a floor plane utils.create_plane(size=200.0, location=(0.0, 0.0, -1.0)) # Instantiate a triangle mesh bpy.ops.mesh.primitive_ico_sphere_add(subdivisions=3) current_object = bpy.context.object # Assign random colors for each triangle mesh = current_object.data mesh.vertex_colors.new(name='Col') random_numbers = get_random_numbers(len(mesh.vertex_colors['Col'].data)) for index, vertex_color in enumerate(mesh.vertex_colors['Col'].data): vertex_color.color = get_color(random_numbers[index // 3]) + tuple( [1.0]) # Setup a material with wireframe visualization and per-face colors mat = bpy.data.materials.new("Material_Visualization") mat.use_nodes = True utils.clean_nodes(mat.node_tree.nodes) current_object.data.materials.append(mat) output_node = mat.node_tree.nodes.new(type='ShaderNodeOutputMaterial') principled_node = mat.node_tree.nodes.new(type='ShaderNodeBsdfPrincipled') rgb_node = mat.node_tree.nodes.new(type='ShaderNodeRGB') mix_node = mat.node_tree.nodes.new(type='ShaderNodeMixShader') wire_node = mat.node_tree.nodes.new(type='ShaderNodeWireframe') wire_mat_node = mat.node_tree.nodes.new(type='ShaderNodeBsdfDiffuse') attrib_node = mat.node_tree.nodes.new(type='ShaderNodeAttribute') attrib_node.attribute_name = 'Col' rgb_node.outputs['Color'].default_value = (0.1, 0.1, 0.1, 1.0) mat.node_tree.links.new(attrib_node.outputs['Color'], principled_node.inputs['Base Color']) mat.node_tree.links.new(principled_node.outputs['BSDF'], mix_node.inputs[1]) mat.node_tree.links.new(rgb_node.outputs['Color'], wire_mat_node.inputs['Color']) mat.node_tree.links.new(wire_mat_node.outputs['BSDF'], mix_node.inputs[2]) mat.node_tree.links.new(wire_node.outputs['Fac'], mix_node.inputs['Fac']) mat.node_tree.links.new(mix_node.outputs['Shader'], output_node.inputs['Surface']) utils.arrange_nodes(mat.node_tree) bpy.ops.object.empty_add(location=(0.0, -0.8, 0.0)) focus_target = bpy.context.object return focus_target
def define_vignette_node(): group = bpy.data.node_groups.new(type="CompositorNodeTree", name="Vignette") input_node = group.nodes.new("NodeGroupInput") group.inputs.new("NodeSocketColor", "Image") group.inputs.new("NodeSocketFloat", "Amount") group.inputs["Amount"].default_value = 0.5 group.inputs["Amount"].min_value = 0.0 group.inputs["Amount"].max_value = 1.0 lens_distortion_node = group.nodes.new(type="CompositorNodeLensdist") lens_distortion_node.inputs["Distort"].default_value = 1.000 separate_rgba_node = group.nodes.new(type="CompositorNodeSepRGBA") blur_node = group.nodes.new(type="CompositorNodeBlur") blur_node.filter_type = 'GAUSS' blur_node.size_x = 300 blur_node.size_y = 300 blur_node.use_extended_bounds = True mix_node = group.nodes.new(type="CompositorNodeMixRGB") mix_node.blend_type = 'MULTIPLY' output_node = group.nodes.new("NodeGroupOutput") group.outputs.new("NodeSocketColor", "Image") group.links.new(input_node.outputs["Amount"], mix_node.inputs["Fac"]) group.links.new(input_node.outputs["Image"], mix_node.inputs[1]) group.links.new(input_node.outputs["Image"], lens_distortion_node.inputs["Image"]) group.links.new(lens_distortion_node.outputs["Image"], separate_rgba_node.inputs["Image"]) group.links.new(separate_rgba_node.outputs["A"], blur_node.inputs["Image"]) group.links.new(blur_node.outputs["Image"], mix_node.inputs[2]) group.links.new(mix_node.outputs["Image"], output_node.inputs["Image"]) utils.arrange_nodes(group)