pythonocc进阶学习:包围盒boundingbox

一、什么是包围盒[1]:

包围盒是一个简单的几何空间,里面包含着复杂形状的物体。为物体添加包围体的目的是快速的进行碰撞检测或者进行精确的碰撞检测之前进行过滤(即当包围体碰撞,才进行精确碰撞检测和处理)。包围体类型包括球体、轴对齐包围盒(AABB)、有向包围盒(OBB)、8-DOP以及凸壳。
在这里插入图片描述
包围盒广泛地应用于碰撞检测,比如射击、点击、相撞等,每一个物体都有自己的包围盒。因为包围盒一般为规则物体,因此用它来代替物体本身进行计算,会比直接用物体本身更加高效和简单。

目前广泛应用的是AABB和OBB包围盒,其中AABB包围盒更常见。因为它的生成方法很简单,因它与坐标轴是对齐的。但它也有不足,它不随物体旋转,可以看出当图中的老虎沿着Z轴方向站立时,AABB包围盒还和老虎比较贴合,但当老虎转了一个角度后,AABB包围盒便增加了较大的空隙,对于较精确的碰撞检测效果不太好。这时就需要OBB包围盒,它始终沿着物体的主成分方向生成最小的一个矩形包围盒,可以随物体旋转,可用于较精确的碰撞检测。

二、包围盒如何运用?

一个物体是有自身的包围盒的,对于2维的线(edge)或者环(wire)来说,对于三维实体来说,其自身的包围盒也很重要,那么包围盒究竟有什么作用呢?对于屏幕适配将具有非常重要的作用。(相机将直接知道所有的物体的包围盒)

  • 对于查看来说,其包围盒是唯一确定的。直接计算所有的mesh的总包围盒
  • 对于爆炸来说,需要计算每一个零部件的包围盒,然后按照相应的爆炸函数进行爆炸。
  • 对于建模来说,随着进行建模的过程,包围盒应当是不断的进行增加的过程。所以应当是实时更新的包围盒 变量。。。这样确保每次适配屏幕都是最合适的样子。

在这里插入图片描述

from OCC.Core.BRepBndLib import brepbndlib_Add
from OCC.Core.BRepMesh import BRepMesh_IncrementalMesh
from OCC.Core.BRepPrimAPI import BRepPrimAPI_MakeBox, BRepPrimAPI_MakeCylinder
from OCC.Core.Bnd import Bnd_Box
from OCC.Core.gp import gp_Pnt
from OCC.Display.OCCViewer import rgb_color

TOL = 1e-4

shape = BRepPrimAPI_MakeCylinder(60, 60, 50).Shape()
# shape = read_iges_file("robot_arm.igs")
tol = TOL   # tol = TOL (by default)
bbox = Bnd_Box()
bbox.SetGap(tol)

mesh = BRepMesh_IncrementalMesh(shape, tol, True)
mesh.Perform()
# this is adds +margin but is faster
brepbndlib_Add(shape, bbox, True)

XMin, YMin, ZMin, XMax, YMax, ZMax = bbox.Get()

xmin = XMin
xmax = XMax
xlen = XMax - XMin
ymin = YMin
ymax = YMax
ylen = YMax - YMin
zmin = ZMin
zmax = ZMax
zlen = ZMax - ZMin

center = gp_Pnt((XMax + XMin) / 2,
                     (YMax + YMin) / 2,
                     (ZMax + ZMin) / 2)

box = BRepPrimAPI_MakeBox(gp_Pnt(xmin,ymin,zmin),gp_Pnt(xmax,ymax,zmax)).Shape()


if __name__ == "__main__":
    from OCC.Display.SimpleGui import init_display
    display, start_display, add_menu, add_function_to_menu = init_display()
    print(xmin)
    print(xmax)
    display.DisplayShape(shape)
    display.DisplayShape(box,update=True,color=rgb_color(0,0,0.1),transparency=1)
    start_display()

导入外界模型,并显示其包围盒,效果如图所示:
在这里插入图片描述
参考链接:
[1] https://blog.csdn.net/u013512448/article/details/52527237


© 版权声明
THE END
喜欢就支持一下吧
点赞702 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容