用Python打造精彩动画与视频,9.1 综合运用所学技术进行项目开发

第九章:综合项目

9.1 综合运用所学技术进行项目开发

在本章中,我们将综合运用前面章节所学的各种技术,开发一个完整的3D动画项目。这个项目将包括3D建模、动画制作、渲染,以及一些高级技巧,如光照和材质设置。通过这个综合项目,您将能够巩固和提升对这些技术的理解和应用能力。

9.1.1 项目概述

我们将创建一个简单的3D动画场景,包含以下元素:

一个地面平面

一个带有材质的立方体

一个带有动画的球体

使用HDRI贴图设置环境光照

使用Python脚本进行自动化控制

9.1.2 项目准备

在开始项目之前,我们需要准备一些素材文件和工具:

素材文件:

HDRI贴图文件(例如:hdri.hdr):可以从HDRI Haven免费下载。访问[HDRI Haven](https://hdrihaven.com)并下载您喜欢的HDRI贴图。

纹理文件(例如:texture.jpg):可以从Textures.com或Poly Haven免费下载。访问[Textures.com](https://www.textures.com/)或[Poly Haven](https://polyhaven.com/textures)并下载您需要的纹理文件。

工具:

Blender(已安装)

确保所有素材文件放置在与Python脚本相同的目录中,以简化路径问题。假设您的Python脚本路径为 E:\PycharmProjects\pythonProject3\run_manim.py,将所有素材文件放在 E:\PycharmProjects\pythonProject3\ 目录中。

示例目录结构:

E:\PycharmProjects\pythonProject3\

├── run_manim.py

├── hdri.hdr

└── texture.jpg

9.1.3 项目实现步骤

我们将分步骤实现这个综合项目,每个步骤包含详细的代码示例和解释。

第一步:创建地面平面

示例代码:

|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| import bpy # 删除所有对象 bpy.ops.object.select_all(action='SELECT') bpy.ops.object.delete(use_global=False) # 创建地面平面 bpy.ops.mesh.primitive_plane_add(size=10, location=(0, 0, 0)) plane = bpy.context.object |

代码解释:

bpy.ops.object.select_all(action='SELECT') 和 bpy.ops.object.delete(use_global=False):删除所有对象。

bpy.ops.mesh.primitive_plane_add(size=10, location=(0, 0, 0)):添加一个大小为10的平面。

第二步:创建带有材质的立方体

示例代码:

|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| # 创建立方体 bpy.ops.mesh.primitive_cube_add(location=(0, 0, 1)) cube = bpy.context.object # 创建新的材质 material = bpy.data.materials.new(name="Cube_Material") material.use_nodes = True # 获取材质节点树 node_tree = material.node_tree # 创建图像纹理节点 tex_image = node_tree.nodes.new('ShaderNodeTexImage') tex_image.image = bpy.data.images.load("E:\\PycharmProjects\\pythonProject3\\texture.jpg") # 获取原始BSDF节点 bsdf = node_tree.nodes['Principled BSDF'] # 连接图像纹理节点到BSDF节点 node_tree.links.new(tex_image.outputs['Color'], bsdf.inputs['Base Color']) # 应用材质到立方体 if cube.data.materials: cube.data.materials[0] = material else: cube.data.materials.append(material) |

代码解释:

bpy.ops.mesh.primitive_cube_add(location=(0, 0, 1)):添加一个立方体。

bpy.data.materials.new(name="Cube_Material"):创建新的材质。

material.use_nodes = True:启用节点系统。

node_tree.nodes.new('ShaderNodeTexImage'):创建图像纹理节点。

tex_image.image = bpy.data.images.load("E:\\PycharmProjects\\pythonProject3\\texture.jpg"):加载图像纹理。

node_tree.links.new(tex_image.outputs['Color'], bsdf.inputs['Base Color']):连接图像纹理节点到BSDF节点。

cube.data.materials.append(material):将材质应用到立方体。

第三步:创建带有动画的球体

示例代码:

|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| # 创建球体 bpy.ops.mesh.primitive_uv_sphere_add(radius=0.5, location=(0, 0, 2)) sphere = bpy.context.object # 设置球体的初始位置并插入关键帧 sphere.location = (0, 0, 2) sphere.keyframe_insert(data_path="location", frame=1) # 设置球体的移动位置并插入关键帧 sphere.location = (0, 0, 0.5) sphere.keyframe_insert(data_path="location", frame=50) # 设置球体的返回位置并插入关键帧 sphere.location = (0, 0, 2) sphere.keyframe_insert(data_path="location", frame=100) |

代码解释:

bpy.ops.mesh.primitive_uv_sphere_add(radius=0.5, location=(0, 0, 2)):添加一个半径为0.5的球体。

sphere.keyframe_insert(data_path="location", frame=1):在第1帧插入球体的位置关键帧。

sphere.keyframe_insert(data_path="location", frame=50):在第50帧插入球体的位置关键帧。

sphere.keyframe_insert(data_path="location", frame=100):在第100帧插入球体的位置关键帧。

第四步:设置环境光照

示例代码:

|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| # 设置渲染引擎为Cycles bpy.context.scene.render.engine = 'CYCLES' # 加载HDRI贴图 bpy.ops.image.open(filepath="E:\\PycharmProjects\\pythonProject3\\hdri.hdr") hdri_image = bpy.data.images["hdri.hdr"] # 设置环境光 world = bpy.context.scene.world world.use_nodes = True env_node_tree = world.node_tree env_background = env_node_tree.nodes['Background'] env_tex_coord = env_node_tree.nodes.new('ShaderNodeTexCoord') env_mapping = env_node_tree.nodes.new('ShaderNodeMapping') env_env_texture = env_node_tree.nodes.new('ShaderNodeTexEnvironment') # 连接节点 env_node_tree.links.new(env_tex_coord.outputs['Generated'], env_mapping.inputs['Vector']) env_node_tree.links.new(env_mapping.outputs['Vector'], env_env_texture.inputs['Vector']) env_node_tree.links.new(env_env_texture.outputs['Color'], env_background.inputs['Color']) # 设置HDRI贴图 env_env_texture.image = hdri_image |

代码解释:

bpy.context.scene.render.engine = 'CYCLES':设置渲染引擎为Cycles。

bpy.ops.image.open(filepath="E:\\PycharmProjects\\pythonProject3\\hdri.hdr"):加载HDRI贴图。

world.use_nodes = True:启用节点系统。

env_node_tree.nodes.new('ShaderNodeTexCoord'):创建纹理坐标节点。

env_node_tree.nodes.new('ShaderNodeMapping'):创建映射节点。

env_node_tree.nodes.new('ShaderNodeTexEnvironment'):创建环境纹理节点。

env_node_tree.links.new(...):连接节点。

env_env_texture.image = hdri_image:设置HDRI贴图。

小结

通过本节的综合项目,您将学会如何在Blender中使用Python API进行高级3D建模和渲染。我们创建了一个包含地面平面、带有材质的立方体、带有动画的球体,并使用HDRI贴图设置环境光照的场景。通过这些步骤,您可以将前面章节所学的技术综合应用于实际项目中,创建更加复杂和高质量的3D动画和场景。在接下来的章节中,我们将探讨更多高级功能和应用,进一步提升您的3D创作技能。

相关推荐
CoderIsArt36 分钟前
Redis的三种模式:主从模式,哨兵与集群模式
数据库·redis·缓存
深度学习lover37 分钟前
<项目代码>YOLOv8 苹果腐烂识别<目标检测>
人工智能·python·yolo·目标检测·计算机视觉·苹果腐烂识别
API快乐传递者2 小时前
淘宝反爬虫机制的主要手段有哪些?
爬虫·python
师太,答应老衲吧3 小时前
SQL实战训练之,力扣:2020. 无流量的帐户数(递归)
数据库·sql·leetcode
阡之尘埃4 小时前
Python数据分析案例61——信贷风控评分卡模型(A卡)(scorecardpy 全面解析)
人工智能·python·机器学习·数据分析·智能风控·信贷风控
Channing Lewis4 小时前
salesforce case可以新建一个roll up 字段,统计出这个case下的email数量吗
数据库·salesforce
毕业设计制作和分享5 小时前
ssm《数据库系统原理》课程平台的设计与实现+vue
前端·数据库·vue.js·oracle·mybatis
ketil275 小时前
Redis - String 字符串
数据库·redis·缓存
Hsu_kk6 小时前
MySQL 批量删除海量数据的几种方法
数据库·mysql
编程学无止境6 小时前
第02章 MySQL环境搭建
数据库·mysql