BMesh 简介

BMesh 是 Blender 中用于表示和操作网格数据的底层数据结构系统,它是传统网格数据结构的高级替代品。

主要特点

  1. 灵活拓扑支持

    • 支持 n-gons(任意边数的多边形),而不仅仅是三角形和四边形
    • 允许边和顶点不属于任何面
  2. 高效操作

    • 设计用于支持复杂的网格编辑操作
    • 提供丰富的 API 用于网格操作
  3. 数据结构

    • 基于半边数据结构(Half-Edge)
    • 包含三种基本元素:顶点(verts)、边(edges)和面(faces)

使用场景

BMesh 主要用于:

  • 编写 Blender 的网格编辑工具
  • 开发复杂的网格处理插件
  • 执行高级网格操作如布尔运算、细分等

基本元素

  1. BMVert:表示顶点
  2. BMEdge:表示边
  3. BMFace:表示面

BMesh 提供了比传统网格更强大的功能,特别是在处理复杂拓扑和非流形几何时表现优异。

访问方式

在 Python API 中,可以通过 bmesh 模块访问 BMesh 功能,通常用于编写网格处理脚本和插件。

创建一个bmesh后,可以贴图不同的材质吗?

是的,在一个 bmesh 对象中创建的多个面完全可以赋予不同的材质,只要你后续把 bmesh 写入 mesh,并对 mesh.polygons[i].material_index 设置正确即可。


✅ 关键点总结

操作目标是否可行方法
一个对象中多个面贴不同材质✅ 支持设置 face.material_index
bmesh 创建时直接贴材质❌ 不直接支持需要在 bmesh.to_mesh() 之后,通过 mesh.polygons[...] 设置
一个 Object 支持多个材质✅ 支持obj.data.materials.append(...) 添加多个材质槽

✅ 正确做法:一个 Object、多个材质、不同面贴图

1. 创建 bmesh 添加多个面

import bpy
import bmesh# 新建 mesh 和 object
mesh = bpy.data.meshes.new("MyMesh")
obj = bpy.data.objects.new("MyObject", mesh)
bpy.context.collection.objects.link(obj)bm = bmesh.new()# 顶点
v1 = bm.verts.new((0, 0, 0))
v2 = bm.verts.new((2, 0, 0))
v3 = bm.verts.new((2, 2, 0))
v4 = bm.verts.new((0, 2, 0))v5 = bm.verts.new((3, 0, 0))
v6 = bm.verts.new((5, 0, 0))
v7 = bm.verts.new((5, 2, 0))
v8 = bm.verts.new((3, 2, 0))# 两个面
face1 = bm.faces.new([v1, v2, v3, v4])
face2 = bm.faces.new([v5, v6, v7, v8])

2. 写入 mesh

bm.to_mesh(mesh)
bm.free()
mesh.update()

3. 添加两个材质到 obj

mat1 = bpy.data.materials.new("Red")
mat2 = bpy.data.materials.new("Green")mat1.diffuse_color = (1, 0, 0, 1)  # RGBA
mat2.diffuse_color = (0, 1, 0, 1)obj.data.materials.append(mat1)
obj.data.materials.append(mat2)

4. 给 mesh.polygons[i] 设置材质索引

# 给第一个面用第一个材质
obj.data.polygons[0].material_index = 0# 给第二个面用第二个材质
obj.data.polygons[1].material_index = 1

结果

在这里插入图片描述


🔁 所以流程是:

  1. bmesh 中构建所有顶点和面;
  2. bm.to_mesh(mesh) 把面数据写到 mesh.polygons
  3. 添加所有材质到 obj.data.materials
  4. 遍历 mesh.polygons[i],设置对应的 material_index = X

❗注意事项

  • 必须保证 obj.data.materials 中的材质数量 >= 所有 material_index 的最大值 + 1;
  • material_index 是一个整数索引(指向材质槽的位置),不是材质本身;
  • 所有 material_index 设置必须在 bm.to_mesh() 后进行,因为 bmesh 阶段没有 material_index 概念。

撰写该博文的原因是有一个需要用脚本来控制一个立方体不同面的贴图,其实现的基本原理和上述代码是一致的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/912326.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/912326.shtml
英文地址,请注明出处:http://en.pswp.cn/news/912326.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何通过nvm切换本地node环境详情教程(已装过node.js更改成nvm)

针对系统已装过node环境或者第一次安装nvm环境如何切换nvm 文章目录 系列文章目录前言一、删除原有node环境二、使用步骤 1.下载nvm软件2.安装node不同版本3.使用node版本4.配置包文件、安装包、配置包环境 总结 一、删除原有node环境 1、删除之前安装的node包,以及…

概率论符号和公式整理

本文是由AI生成后,经作者优化整理的文章。个人总结,仅限参考! 以下整理了概率论中的常用符号和公式表格,覆盖基础知识、关键定理和常用分布: 一、基础集合与事件符号 符号名称含义/公式说明 S S S样本空间所有可能结…

SpringSecurity是什么?

Spring Security是Spring生态中的安全框架,用于管理Web应用的认证与权限控制,支持多种登录方式并集成防护机制,可防范CSRF/XSS等攻击,保障企业级系统的安全性。 一、核心功能与定位 身份认证(Authentication&#xff…

nt!IoSynchronousPageWrite函数分析之atapi!IdeReadWrite----非常重要

第一部分:预分析 1: kd> g Breakpoint 7 hit atapi!IdeReadWrite: f729cb2a 55 push ebp 1: kd> kc # 00 atapi!IdeReadWrite 01 atapi!IdeSendCommand 02 atapi!AtapiStartIo 03 atapi!IdeStartIoSynchronized 04 nt!KeSynchronizeExecuti…

软考系统架构设计师经验总结

本文目的 对参加的2025年上半年系统架构设计师考试进行总结提供一些备考思路给未来参加系统架构设计师的同学 个人背景 工作背景 本科计算机与技术(学过一些计算机基础课程),15年毕业后从事过b端(人群画像、营销、用户增长、硬…

Tailwind CSS工作原理

文章目录 前言1. 指令解析与 AST 操作🚩 **核心处理流程**🧩 **具体流程说明** 2. **配置驱动的样式生成**3. **JIT 模式(Just-In-Time)的核心逻辑**4. **插件与自定义扩展**5. **与 PostCSS 管道的协同**6. **优化与 Tree Shakin…

web网页开发,在线%旅游景点管理%系统demo,基于Idea,vscode,html,css,vue,java,maven,springboot,mysql

经验心得 两业务单,都是业务逻辑开发,基本crud,什么是前后端,怎么分离前后端,前后端怎么通讯的,是以什么格式进行通讯这些咱们都需要掌握,后面剩下就是前后端不同层如何优化。管理系统很常见了其…

面试150 长度最小的子数组

思路 联想到滑动窗口法。左窗口的值为0,遍历数组对数组求和,当数组的和大于等于target的时候,窗口要收缩,计算子数组的长度,并及时更新最小的长度,左窗口右移。 class Solution:def minSubArrayLen(self,…

Python字典的查询操作

一、前言 在 Python 中,字典(dict) 是一种非常常用的数据结构,以键值对(Key-Value Pair)形式存储数据,支持快速查找、插入和删除操作。 本文将系统性地介绍 Python 字典中常见的查询操作方法&…

pyhton基础【18】面向对象基础一

目录 一.面向对象 二.面向对象概述 三.类与对象 一.面向对象 Python中的面向对象编程OOP是一种编程范式,它使用对象来设计软件。对象是具有属性(称为属性)和可以执行的操作(称为方法)的数据结构。 基础概念 类:class 类是创建对象的蓝图或模板。它…

Requests源码分析:面试考察角度自验(初级)

简单描述执行流程 Q:能简单描述一下发送一个requests.get(url)请求时,在requests库内部的主要执行流程吗?(从调用get方法到收到响应) 入口委托: get() 方法内部调用 requests.request(GET, url)。Session 接管: request() 方法会获取或隐式创建一个 Session 对象,并调用…

鸿蒙5:条件-循环-列表渲染

注意:博主有个鸿蒙专栏,里面从上到下有关于鸿蒙next的教学文档,大家感兴趣可以学习下 如果大家觉得博主文章写的好的话,可以点下关注,博主会一直更新鸿蒙next相关知识 专栏地址: https://blog.csdn.net/qq_56760790/…

浅谈AI大模型-MCP

MCP简介 MCP(Model Context Protocol,模型上下文协议 ),24年11月初的时候Anthropic发了一篇技术博客,推出了他们的模型上下文协议MCP,介绍了一种规范:应用如何为LLM提供上下文。官网称MCP为AI应…

MySQL数据库基础概述

前言: MySQL作为全球应用最广泛的开源关系型数据库管理系统(RDBMS)​,凭借其高性能、高可靠性与零成本特性,已成为Web应用、企业系统的核心数据引擎。它遵循SQL标准,通过表结构实现数据的结构化存储&#x…

桌面小屏幕实战课程:DesktopScreen 16 HTTP

飞书文档http://https://x509p6c8to.feishu.cn/docx/doxcnrxBs55qGn6xoysTcJpqwRf /home/kemp/work/esp/esp-idf/examples/protocols/http_request 源码下载方式参考: 源码下载方式 心知天气 注册账号,申请产品,获取密钥 产品 天气数据 H…

vs2019 + QT下 vs2019创建的项目打开ui文件失败

问题: 在vs2019 QT模式下。使用2019创建工程后。点击ui文件打开时。出现奔溃,如下图 解决方式: ui文件->右键->打开方式->添加->程序->点击三个点->qcreator(qt安装目录) ->设置为默认值->确定 点击设置为默认值,点…

WPS之PPT镂空效果实现

1、准备一张图片,剪切存入剪贴板 2、把图片设为背景 右键 》 设置背景格式 》 图片或纹理填充 》 图片填充选择剪贴板 3、插入一个矩形覆盖全图,设置无线条渐变填充从左到右 4、插入圆角矩形 5、单击小黄点调整弧度 6、选择无线条幻灯片背景填充 7、插…

服务注册中心的本质抉择:从业务本质看AP与CP的终极之选

本文从服务注册中心的本质职责出发,通过分析其核心功能、业务场景和技术约束,深入探讨服务注册中心在架构设计上应该优先保证AP还是CP特性。文章首先剖析服务注册中心的根本使命,然后从分布式系统原理、生产实践案例和性能表现三个维度进行对…

mybatis-plus从入门到入土(一):快速开始

​ 朋友们, 大家好, 从今天开始我想开一个系列博客。名字起的比较随意就叫Mybatis-Plus从入门到入土, 这系列博客的定位是从基础使用开始, 然后逐步深入全面的了解Mybatis-Plus框架, 写这个博客的主要原因是工作中经常用到Mybatis-Plus框架, 因而对这个框架相对比较了解一些, 顺…

如何快速将iPhone中的文本保存到电脑上

您的 iPhone 上是否有很多重要的短信,并且您想将短信备份到计算机上?我们都知道传输消息与传输照片不同,但幸运的是,您可以使用相关的工具和方法来实现。我们介绍了 4 种方法来解释如何将 iPhone 中的文本保存到计算机。所有的办法…