0

0

在Open3D中利用体素网格坐标进行三维模型缺陷定位与插入

心靈之曲

心靈之曲

发布时间:2025-12-13 17:20:01

|

574人浏览过

|

来源于php中文网

原创

在Open3D中利用体素网格坐标进行三维模型缺陷定位与插入

本教程详细阐述了如何使用open3d库通过体素化方法,在目标三维模型(如`.obj`文件)的实体区域内精确插入一个缺陷模型(如`.ply`文件),同时避免空隙和顶点干扰。文章解决了在使用`voxelgrid`时常见的`attributeerror`和`typeerror`,指出了正确的api调用方式`get_voxel_center_coordinate`并强调了访问`voxel`对象的`grid_index`属性的重要性,最终提供了一个完整的、可操作的代码示例。

理解体素化与三维模型缺陷插入

在三维几何处理中,体素化是将连续的三维模型离散化为一系列规则排列的小立方体(体素)的过程。这种方法在许多应用中都非常有用,例如碰撞检测、体积计算以及本文讨论的在复杂模型内部插入其他几何体。当我们需要在一个可能包含空洞或复杂内部结构的三维对象(如一个中空物体)中插入一个“缺陷”时,体素化提供了一种可靠的机制来识别并定位目标对象内的实体区域,从而避免将缺陷放置在模型的空隙或表面顶点上。

传统的基于顶点或面的几何操作可能难以精确控制插入位置,特别是在需要确保缺陷完全位于目标对象的“实体”部分时。体素网格通过将空间划分为离散单元,允许我们识别哪些体素被目标对象占据,从而为缺陷的定位提供了一个结构化的参考系。

Open3D体素网格基础

Open3D是一个强大的开源库,用于处理三维数据。它提供了o3d.geometry.VoxelGrid类,用于创建和操作体素网格。

创建体素网格: 我们可以通过o3d.geometry.VoxelGrid.create_from_triangle_mesh()方法从三角网格(o3d.geometry.TriangleMesh)创建体素网格。这个方法需要两个主要参数:

  • mesh: 源三角网格对象。
  • voxel_size: 体素的大小。这个值决定了体素网格的精度,较小的体素尺寸会生成更精细的网格,但也会增加计算复杂度和内存消耗。

获取占据的体素: 创建体素网格后,可以使用get_voxels()方法获取所有被几何体占据的体素列表。这个方法返回一个open3d.cpu.pybind.geometry.Voxel对象的列表,每个Voxel对象都包含其在体素网格中的grid_index(一个三维整数坐标)以及颜色信息。

常见问题与解决方案:获取体素中心坐标

在尝试将缺陷模型平移到目标体素的中心时,用户经常会遇到以下两种错误:

问题一:AttributeError: 'open3d.cpu.pybind.geometry.VoxelGrid' object has no attribute 'get_voxel_center'

这个错误表明VoxelGrid对象没有名为get_voxel_center的方法。根据Open3D的官方文档,正确的API是get_voxel_center_coordinate。

错误原因: 用户可能参考了旧版本API或混淆了其他库的命名约定。

解决方案: 将try_voxel_grid.get_voxel_center(selected_voxel)替换为try_voxel_grid.get_voxel_center_coordinate(selected_voxel.grid_index)。

问题二:TypeError: unsupported operand type(s) for *: 'open3d.cpu.pybind.geometry.Voxel' and 'float'

这个错误发生在尝试手动计算体素中心时,因为get_voxels()返回的是Voxel对象,而不是一个可以直接进行数学运算的坐标数组。

Magic Eraser
Magic Eraser

AI移除图片中不想要的物体

下载

错误原因:selected_voxel是一个open3d.cpu.pybind.geometry.Voxel类型的对象,它不能直接与浮点数进行乘法运算。要获取体素的网格索引(即其在体素网格中的整数坐标),需要访问其grid_index属性。

解决方案: 在手动计算体素中心时,应使用selected_voxel.grid_index来获取体素的整数坐标。然而,更推荐的方法是使用Open3D提供的get_voxel_center_coordinate方法,因为它已经封装了这些计算,并考虑了体素网格的内部结构和原点。

实践:在三维模型中插入球形缺陷

下面是一个修正后的完整代码示例,演示了如何将一个球形缺陷模型精确地插入到另一个三维对象的实体区域内。

import open3d as o3d
import numpy as np

def main():
    # 1. 文件路径
    # 请根据您的实际文件路径修改
    try_obj_path = '/Users/xd_anshul/Desktop/Research/try.obj'
    defect_path = '/Users/xd_anshul/Desktop/Research/Project Defect/sphere.ply'

    # 2. 加载网格模型
    try_mesh = o3d.io.read_triangle_mesh(try_obj_path)
    defect_mesh = o3d.io.read_triangle_mesh(defect_path)

    # 3. 对缺陷模型进行预处理(缩放)
    # 假设需要将缺陷缩小一半,并以其自身中心为缩放点
    scaled_defect = defect_mesh.scale(0.5, center=defect_mesh.get_center())
    # 确保缺陷网格的法线正确,以便体素化和可视化
    scaled_defect.compute_vertex_normals()

    # 4. 将网格转换为体素网格
    # 调整体素尺寸以平衡精度和性能
    voxel_size = 0.2
    try_voxel_grid = o3d.geometry.VoxelGrid.create_from_triangle_mesh(try_mesh, voxel_size)

    # 5. 获取目标网格中被占据的体素
    # get_voxels() 返回 Voxel 对象的列表
    occupied_voxels = try_voxel_grid.get_voxels()

    if not occupied_voxels:
        print("Warning: No occupied voxels found in the target mesh. Check voxel_size or mesh integrity.")
        return

    # 6. 随机选择一个被占据的体素作为缺陷的插入点
    voxel_index_in_list = np.random.randint(0, len(occupied_voxels))
    selected_voxel = occupied_voxels[voxel_index_in_list]

    # 7. 获取所选体素的中心坐标
    # 关键修正:使用 get_voxel_center_coordinate 并传入 Voxel 对象的 grid_index
    translation_vector = try_voxel_grid.get_voxel_center_coordinate(selected_voxel.grid_index)

    # 8. 将缺陷模型平移到选定体素的中心
    # 缺陷模型会以其当前原点为参考点进行平移
    scaled_defect.translate(translation_vector, relative=False) # relative=False表示绝对平移到指定位置

    # 9. 合并网格并可视化
    combined_mesh = try_mesh + scaled_defect
    combined_mesh.compute_vertex_normals() # 重新计算法线以获得更好的渲染效果
    o3d.visualization.draw_geometries([combined_mesh], window_name="Combined Mesh with Defect")

if __name__ == "__main__":
    main()

代码解析:

  1. 加载模型: 使用o3d.io.read_triangle_mesh加载目标对象和缺陷对象。
  2. 缺陷预处理: 对缺陷模型进行必要的缩放、旋转或平移。这里我们将其缩小一半,并计算其顶点法线,这对于后续的体素化和可视化很重要。
  3. 创建体素网格: 使用create_from_triangle_mesh将目标模型转换为体素网格。voxel_size参数是关键,它决定了体素的大小和网格的粒度。
  4. 获取占据体素: try_voxel_grid.get_voxels()返回一个Voxel对象的列表,这些体素代表了目标模型的实体区域。
  5. 选择插入点: 从occupied_voxels列表中随机选择一个Voxel对象。
  6. 获取体素中心坐标(关键修正): 使用try_voxel_grid.get_voxel_center_coordinate(selected_voxel.grid_index)来获取所选体素的精确中心三维坐标。这是解决AttributeError和TypeError的关键步骤。
  7. 平移缺陷: 使用scaled_defect.translate(translation_vector, relative=False)将缺陷模型平移到计算出的体素中心。relative=False确保缺陷的中心(或其当前原点)被放置在translation_vector指定的位置。
  8. 合并与可视化: 将原始目标模型与平移后的缺陷模型合并,并使用o3d.visualization.draw_geometries进行可视化。

注意事项与最佳实践

  • 体素尺寸选择: voxel_size是一个关键参数。
    • 过大: 可能导致精度不足,缺陷插入位置不精确,甚至可能无法识别出模型的细微结构。
    • 过小: 会显著增加内存消耗和计算时间,尤其对于大型或复杂的模型。建议从一个适中的值开始,然后根据需求进行调整。
  • 模型原点与坐标系: 确保缺陷模型和目标模型在导入Open3D后具有一致的坐标系。平移操作通常是相对于模型的当前原点进行的。
  • 缺陷模型的尺寸与形状: 插入的缺陷模型应与目标体素网格的粒度相适应。如果缺陷模型太小,可能会在体素化时丢失信息;如果太大,可能无法被单个体素完全容纳。
  • 性能优化: 对于非常大的模型,体素化和体素操作可能会非常耗时。考虑使用更高效的数据结构或并行计算来优化性能。
  • 边界条件处理: 如果缺陷需要插入到模型的特定区域或接近边界,可能需要更复杂的逻辑来选择体素,例如基于体素的法线信息或距离计算。
  • 可视化检查: 始终可视化最终结果,以验证缺陷是否被正确插入。

总结

通过Open3D的体素化功能,我们能够有效地在三维模型内部的实体区域精确插入其他几何体。解决get_voxel_center方法不存在以及Voxel对象不能直接进行数值运算的TypeError的关键在于正确使用get_voxel_center_coordinate方法,并传入Voxel对象的grid_index属性。掌握这些技术,可以为三维数据处理中的缺陷建模、结构分析等任务提供强大的工具

相关专题

更多
css中float用法
css中float用法

css中float属性允许元素脱离文档流并沿其父元素边缘排列,用于创建并排列、对齐文本图像、浮动菜单边栏和重叠元素。想了解更多float的相关内容,可以阅读本专题下面的文章。

566

2024.04.28

C++中int、float和double的区别
C++中int、float和double的区别

本专题整合了c++中int和double的区别,阅读专题下面的文章了解更多详细内容。

99

2025.10.23

treenode的用法
treenode的用法

​在计算机编程领域,TreeNode是一种常见的数据结构,通常用于构建树形结构。在不同的编程语言中,TreeNode可能有不同的实现方式和用法,通常用于表示树的节点信息。更多关于treenode相关问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

535

2023.12.01

C++ 高效算法与数据结构
C++ 高效算法与数据结构

本专题讲解 C++ 中常用算法与数据结构的实现与优化,涵盖排序算法(快速排序、归并排序)、查找算法、图算法、动态规划、贪心算法等,并结合实际案例分析如何选择最优算法来提高程序效率。通过深入理解数据结构(链表、树、堆、哈希表等),帮助开发者提升 在复杂应用中的算法设计与性能优化能力。

17

2025.12.22

深入理解算法:高效算法与数据结构专题
深入理解算法:高效算法与数据结构专题

本专题专注于算法与数据结构的核心概念,适合想深入理解并提升编程能力的开发者。专题内容包括常见数据结构的实现与应用,如数组、链表、栈、队列、哈希表、树、图等;以及高效的排序算法、搜索算法、动态规划等经典算法。通过详细的讲解与复杂度分析,帮助开发者不仅能熟练运用这些基础知识,还能在实际编程中优化性能,提高代码的执行效率。本专题适合准备面试的开发者,也适合希望提高算法思维的编程爱好者。

21

2026.01.06

PHP 高并发与性能优化
PHP 高并发与性能优化

本专题聚焦 PHP 在高并发场景下的性能优化与系统调优,内容涵盖 Nginx 与 PHP-FPM 优化、Opcode 缓存、Redis/Memcached 应用、异步任务队列、数据库优化、代码性能分析与瓶颈排查。通过实战案例(如高并发接口优化、缓存系统设计、秒杀活动实现),帮助学习者掌握 构建高性能PHP后端系统的核心能力。

98

2025.10.16

PHP 数据库操作与性能优化
PHP 数据库操作与性能优化

本专题聚焦于PHP在数据库开发中的核心应用,详细讲解PDO与MySQLi的使用方法、预处理语句、事务控制与安全防注入策略。同时深入分析SQL查询优化、索引设计、慢查询排查等性能提升手段。通过实战案例帮助开发者构建高效、安全、可扩展的PHP数据库应用系统。

82

2025.11.13

JavaScript 性能优化与前端调优
JavaScript 性能优化与前端调优

本专题系统讲解 JavaScript 性能优化的核心技术,涵盖页面加载优化、异步编程、内存管理、事件代理、代码分割、懒加载、浏览器缓存机制等。通过多个实际项目示例,帮助开发者掌握 如何通过前端调优提升网站性能,减少加载时间,提高用户体验与页面响应速度。

25

2025.12.30

PS使用蒙版相关教程
PS使用蒙版相关教程

本专题整合了ps使用蒙版相关教程,阅读专题下面的文章了解更多详细内容。

23

2026.01.19

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
React 教程
React 教程

共58课时 | 3.8万人学习

Pandas 教程
Pandas 教程

共15课时 | 0.9万人学习

ASP 教程
ASP 教程

共34课时 | 3.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号