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

embedded/2024/12/22 13:18:15/

 第九章:综合项目

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创作技能。


http://www.ppmy.cn/embedded/93414.html

相关文章

自动化报表实践小结

这一天午休刚休息完,财务经理就喊我:“***,我们找个会议室聊聊”。我是一脸茫然,心里想着,我跟他也没什么私下的工作交流啊,能聊啥呢,还要找个会议室?究竟是什么事情呢?有…

Stable Diffusion绘画 | 插件-prompt-all-in-one:轻松搞定提示词

插件安装包下载链接:sd-webui-prompt-all-in-one 安装成功后,正向与反向提示词输入框下方,会多出一排的标签。 常用功能 翻译 在下方输入框内,使用中文输入提示词内容: 点击回车↩︎后,会在提示词输入框…

C#图片批量下载Demo

目录 效果 项目 代码 下载 效果 C#图片批量下载 项目 代码 using Aspose.Cells; using NLog; using System; using System.Collections.Generic; using System.Data; using System.Diagnostics; using System.Drawing; using System.IO; using System.Linq; using System.…

深入理解单元测试与JUnit:从基础概念到实践操作

文章目录 前言一、单元测试是什么?单元测试的特点单元测试的好处 二、junit是什么?三、操作步骤1.junit安装2.maven新建项目3. 新建java文件4. 生成测试类5. 编写测试方法6. 测试结果 总结 前言 随着软件开发行业的不断发展,测试的重要性日益…

利用 Vue.js 的计算属性精简和增强你的前端逻辑

目录 格式化显示数据 计算购物车总价 过滤列表 依赖其他计算属性 在开发现代web应用时,Vue.js 作为一个轻量级且功能强大的前端框架,提供了许多便利的特性,其中计算属性(computed properties)是其最富盛名和实用的功能之一。计算属性允许开发者基于组件的数据动态生成…

vue2动态切换组件(demo)

demo背景&#xff1a;页面上新增字段&#xff08;接口返回&#xff09;&#xff0c;根据新增字段的类型来匹配相应的输入框&#xff0c;比如int匹配数字输入框&#xff0c;String匹配字符类型输入框&#xff0c;data匹配时间输入框... 新增字段 <el-form-item label"字…

SQL Server 事务

1. 什么是事务 SQL Server 事务是数据库操作的一个基本特性&#xff0c;它允许你将一系列数据库操作组合成一个原子单元&#xff0c;这个单元中的所有操作要么全部成功&#xff0c;要么全部失败。事务具有以下四个重要的属性&#xff0c;通常被称为ACID属性。 2、事务的特性 原…

nodejs爬虫示例<爬取官网首页>

背景 大家都知道&#xff0c;Python爬虫是最牛掰的&#xff0c;那么前端人员能玩爬虫吗&#xff1f; 会Python&#xff1a;那么爬虫会很舒服&#xff0c;Python有很多成熟的库&#xff0c;我们可以直接拿来用不会Python&#xff1a;爬虫也没那么难&#xff0c;就是需要摸索一…