精华内容
下载资源
问答
  • bvh:动态AABB树实现
  • 由于它们的速度和灵活性,AABB 也非常适合物理应用中的重叠检测,例如分子模拟。 它们对于粒子种类之间存在较大尺寸差异或粒子密度极不均匀的系统特别有用。 在这种情况下,传统的邻居查找工具(例如)可能会变得...
  • Unity3D AABB树-脑血管介入手术VR碰撞检测算法

    千次阅读 热门讨论 2020-04-12 21:33:06
    脑血管介入手术VR仿真常用的碰撞检测算法是AABB树,看这篇论文。 AABB树又叫Octree或者BVH(Bounding Volume Hierarchy)。 大致原理就是把一个模型在最外层用一个大的AABB包裹起来,然后再把这个大的AABB划分为各个次...

    引言

    前两周有位同学看了AABB包围盒效果那篇文章,就来问了下脑血管介入手术碰撞检测算法该怎么实现。
    脑血管介入手术VR仿真常用的碰撞检测算法是AABB树,看这篇论文
    AABB树又叫Octree或者BVH(Bounding Volume Hierarchy)。
    大致原理就是把一个模型在最外层用一个大的AABB包裹起来,然后再把这个大的AABB划分为各个次大的AABB,然后再把次大的AABB划分为各个小的AABB。形成树一样的结构,有主干有分支,检测的时候先检测主干如果有碰撞则再检测分支,分支有碰撞则再检测叶节点,这样可以大大提高碰撞检测的效率。(如果不用AABB树,则每次检测都需要遍历所有叶节点才能判断碰撞到哪儿了)
    周末有空就研究了一下,效果如下。

    效果

    AABB树效果
    如图,小球是手术中用到的导丝,蓝色是血管壁。红色框是检测到碰撞的AABB树的主干和分支,黄色是AABB树的叶节点,也就是这个项目里面的血管壁。(在这个项目里面,只有碰撞到血管壁才处理)
    其实用AABB有个很大的缺点是模型不能旋转,旋转后AABB的盒子会变得很大,检测就不精确了,不知为啥论文里面选了这种方法。

    原理

    直接看文章吧,他们讲得很好。

    源码

    放到这儿了,提取码:c1n3。

    展开全文
  • 关于构建AABB树过程中内存优化

    千次阅读 2016-04-07 21:28:42
    涉及到了数据结构为AABB树,具体参考http://www.codercorner.com/Opcode.htm 为了测试内存的使用,选取的测试用例为220w的三角形面片的模型。 一开始自己创建的节点类为: class AABBTreeNode { //************* ...

    最近在实现鼠标捡取对象时,需要实时计算射线与三角形是否相交。

    涉及到了数据结构为AABB树,具体参考http://www.codercorner.com/Opcode.htm


    为了测试内存的使用,选取的测试用例为220w的三角形面片的模型。

    一开始自己创建的节点类为:

    class AABBTreeNode
    {
    //*************
            float *box;//当前节点的包围盒
    	int *m_NodePrimitives;
    	intmNbPrimitives;
    	AABBTreeNode *left;
    	AABBTreeNode *right;
    }
    构造过程中不断的new出包围盒的数据

    同时在构造树的递归过程中,不断的new左右子树指针。

    刚开始的内存占用为:总共700M左右

    实在难以承受。


    然后参考OPCODE实现思路

    class AABBTreeNode
    {
    //*************
           <span style="color:#ff0000;"> float box[6];//当前节点的包围盒</span>
    	int *m_NodePrimitives;
    	intmNbPrimitives;
    	AABBTreeNode *left;
    	AABBTreeNode *right;
    }

    经过这个步骤内存降了100M左右。

    同时在构造节点过程中预先new出内存:

    AABBTreeNode *root = new AABBTreeNode[2 * mNbPrimitives-1];

    此时内存总共占用约为230M

     

    实在很夸张,记下来,防止以后犯类似错误。

    展开全文
  • Cocos2d-x教程(33)-三维物体AABB碰撞检测算法

    面试题:微信飞机大战/扑鱼类碰撞检测一般每帧检测 会很耗性能导致卡顿,
    如何优化:使用四叉树 (例如:位于上半屏直接诶不检测)
    https://blog.csdn.net/u012861978/article/details/52249721 - 在2D空间中使用四叉树实现碰撞检测

    Cocos2d-x教程(33)-三维物体AABB碰撞检测算法
    OBB包围盒及其碰撞检测算法(一)—https://blog.csdn.net/artele/article/details/54729847

    在这里插入图片描述

    展开全文
  • 「AABB Tree」AABB树组件提供了静态数据结构和算法,以支持对有限的3D对象集执行相交和距离查询。可以查询存储在数据结构中的一组几何对象,以进行相交检测、相交计算和距离计算。 如果在traits类中实现了相应的...

    官方文档:3D Fast Intersection and Distance Computation (AABB Tree)
    原文链接,不定时更新,此文档为第一版,之后不再同步。
    CGAL笔记:yuque.com/cppdev/cgal

    AABB Tree简介

    「AABB Tree」AABB树组件提供了静态数据结构和算法,以支持对有限的3D对象集执行相交和距离查询。可以查询存储在数据结构中的一组几何对象,以进行相交检测、相交计算和距离计算。

    1. 如果在traits类中实现了相应的相交谓词和构造函数,则相交查询可以支持任何类型
    2. 距离查询仅限于点查询


    「官方提供的例子」

    1. 相交查询:针对三角形集的线对象(射线、线、线段)查询、针对线段集的平面对象(平面、三角形)
    2. 距离查询:查找从点查询到一组三角形的最近点


    「注意」此组件不适合在n个对象集中查找所有对象的交对。适用于dD lso定向盒的相交序列组件,它可以找到所有ISO定向盒的相交对


    「工作原理」

    1. AABB树将几何数据的迭代器(例如,std::list<Triangle>的迭代器)作为输入,然后将其转换为基元(primitives)
    2. 根据这些原语(primitives),构建轴对齐边界框(AABB)的层次结构,并将其用于加快相交和距离查询。每个图元(primitive)可以访问一个输入几何对象(称之为基准)和该对象的一个参考标识。
    3. 每个相交查询可以返回相交图元的相交对象(例如,用于射线查询的3D点或线段)以及id(face的句柄)
    4. 同样,每个距离查询都可以返回点查询中最接近的点以及最接近的图元id

    接口

    构造

    AABB Tree组件的主要入口点是AABB_tree,该类从几何数据集中构建一个静态的AABB树,该类实例化后,即可进行相交和距离查询等操作

    由Triangle构造

    #include <CGAL/Simple_cartesian.h>
    #include <CGAL/AABB_tree.h>
    #include <CGAL/AABB_traits.h>
    #include <CGAL/AABB_triangle_primitive.h>
    
    typedef CGAL::Simple_cartesian<double> K;
    
    typedef K::FT FT;
    typedef K::Ray_3 Ray;
    typedef K::Line_3 Line;
    typedef K::Point_3 Point;
    typedef K::Triangle_3 Triangle;
    
    typedef std::list<Triangle>::iterator Iterator;
    typedef CGAL::AABB_triangle_primitive<K, Iterator> Primitive;
    typedef CGAL::AABB_traits<K, Primitive> AABB_triangle_traits;
    typedef CGAL::AABB_tree<AABB_triangle_traits> Tree;
    
    Point a(1.0, 0.0, 0.0);
    Point b(0.0, 1.0, 0.0);
    Point c(0.0, 0.0, 1.0);
    Point d(0.0, 0.0, 0.0);
    
    std::list<Triangle> triangles;
    triangles.push_back(Triangle(a,b,c));
    triangles.push_back(Triangle(a,b,d));
    triangles.push_back(Triangle(a,d,c));
    
    Tree tree(triangles.begin(),triangles.end());
    

    由Polyhedron构造

    #include <CGAL/Simple_cartesian.h>
    #include <CGAL/AABB_tree.h>
    #include <CGAL/AABB_traits.h>
    #include <CGAL/Polyhedron_3.h>
    #include <CGAL/AABB_face_graph_triangle_primitive.h>
    
    typedef CGAL::Simple_cartesian<double> K;
    typedef K::Point_3 Point;
    typedef K::Plane_3 Plane;
    typedef K::Vector_3 Vector;
    typedef K::Segment_3 Segment;
    typedef K::Ray_3 Ray;
    typedef CGAL::Polyhedron_3<K> Polyhedron;
    typedef CGAL::AABB_face_graph_triangle_primitive<Polyhedron> Primitive;
    typedef CGAL::AABB_traits<K, Primitive> Traits;
    typedef CGAL::AABB_tree<Traits> Tree;
    typedef boost::optional< Tree::Intersection_and_primitive_id<Segment>::Type > Segment_intersection;
    typedef boost::optional< Tree::Intersection_and_primitive_id<Plane>::Type > Plane_intersection;
    typedef Tree::Primitive_id Primitive_id;
    
    Point p(1.0, 0.0, 0.0);
    Point q(0.0, 1.0, 0.0);
    Point r(0.0, 0.0, 1.0);
    Point s(0.0, 0.0, 0.0);
    
    Polyhedron polyhedron;
    polyhedron.make_tetrahedron(p, q, r, s);
    
    // constructs AABB tree
    Tree tree(faces(polyhedron).first, faces(polyhedron).second, polyhedron);
    

    相交测试

    1. AABB_tree::do_intersect():测试输入图形是否与AABB树相交。此函数之所以快速,是因为它仅涉及谓词,并在遇到第一个相交点后就停止
    2. AABB_tree::number_of_intersected_primitives():计算所有相交图元,返回个数
    3. AABB_tree::all_intersected_primitives():枚举出所有相交图元的id(所以无需构造相应的相交对象)
    4. AABB_tree::any_intersected_primitive():返回第一个相交的图元id(如果存在相交情况)
    5. AABB_tree::first_intersected_primitive():返回与射线最近的相交对象ID(如果存在)
    // 与线段是否相交
    Segment segment_query(a,b);
    if(tree.do_intersect(segment_query))
            std::cout << "intersection(s)" << std::endl;
    else
        std::cout << "no intersection" << std::endl;
    
    // 与射线相交的个数
    Ray ray_query(a,b);
    std::cout << tree.number_of_intersected_primitives(ray_query) 
        << " intersections(s) with ray query" << std::endl;
    
    // 与线段相交的所有图元的ID
    std::list<Primitive_id> primitives;
    tree.all_intersected_primitives(segment_query, std::back_inserter(primitives));
    

    构造出结果(Constructions)

    1. AABB_tree::all_intersections():与输入图元做相交检测,并构造出所有对象
    2. AABB_tree::any_intersection():检测并构造出第一个相交图元
    3. AABB_tree::first_intersection():检测并构造出与射线最近的相交对象
    // 获得所有结果
    std::list<Segment_intersection> intersections;
    tree.all_intersections(segment_query, std::back_inserter(intersections));
    
    // 检测并构造出第一个相交图元
    Vector vec(0.0,0.0,1.0);
    Plane plane_query(a,vec);
    Plane_intersection plane_intersection = tree.any_intersection(plane_query);
    if(plane_intersection) {
        if(boost::get<Segment>(&(plane_intersection->first)))
            std::cout << "intersection object is a segment" << std::endl;
    }
    

    距离计算

    1. AABB_tree::closet_point():获得距离给定点最近的点
    2. AABB_tree::closest_point_and_primitive():获得距离给定点最近的图元ID

    说明:AABB_tree使用辅助搜索结构来加快距离查询,但默认情况下并不会生成此数据结构,因为它仅用于距离计算。用户可在第一次计算距离之前,通过调用AABB_tree::accelerate_distance_queries()来请求二级结构的构造。

    // 计算最近点
    Point point_query(2.0, 2.0, 2.0);
    Point closest_point = tree.closest_point(point_query);
    std::cerr << "closest point is: " << closest_point << std::endl;
    
    // 最近的距离
    FT sqd = tree.squared_distance(point_query);
    std::cout << "squared distance: " << sqd << std::endl;
    
    // 计算最近点和最近点所在的图元ID
    typedef Tree::Point_and_primitive_id Point_and_primitive_id;
    Point_and_primitive_id pp = tree.closest_point_and_primitive(query);
    Point closest_point = pp.first; // 最近点
    Polyhedron::Face_handle f = pp.second;	// 最近点所在的图元ID
    std::cout << "closest point: " << closest_point << std::endl;
    std::cout << "closest triangle: ( "
        << f->halfedge()->vertex()->point() << " , " 
        << f->halfedge()->next()->vertex()->point() << " , "
        << f->halfedge()->next()->next()->vertex()->point()
        << " )" << std::endl;
    

    简单例子

    三角形碰撞检测

    // Author(s) : GeoDoer
    
    #include <iostream>
    #include <list>
    
    #include <CGAL/Simple_cartesian.h>
    #include <CGAL/AABB_tree.h>
    #include <CGAL/AABB_traits.h>
    #include <CGAL/AABB_triangle_primitive.h>
    
    typedef CGAL::Simple_cartesian<double> Kernel;
    typedef Kernel::Point_3 Point3;
    typedef Kernel::Triangle_3 Triangle_3;
    typedef std::list<Triangle_3>::iterator Iterator;
    typedef CGAL::AABB_triangle_primitive<Kernel, Iterator> Primitive;
    typedef CGAL::AABB_traits<Kernel, Primitive> AABB_triangle_traits;
    typedef CGAL::AABB_tree<AABB_triangle_traits> Tree;
    typedef Tree::Primitive_id Primitive_id;
    
    int main()
    {
    	三角网
    	Point3 a(1.0, 0.0, 0.0);
    	Point3 b(0.0, 1.0, 0.0);
    	Point3 c(0.0, 0.0, 1.0);
    	Point3 d(0.0, 0.0, 0.0);
    
    	std::list<Triangle_3> triangles;
    	triangles.push_back(Triangle_3(a, b, c));
    	triangles.push_back(Triangle_3(a, b, d));
    	triangles.push_back(Triangle_3(a, d, c));
    
    	三角网的AABB_tree
    	Tree tree(triangles.begin(), triangles.end());
    
    	用一个三角形与该三角网做相撞测试
    	Triangle_3 tri_query(c, d, b);
    
    	碰撞检测
    	if(!tree.do_intersect(tri_query))
    	{
    		std::cout << "不相交" << std::endl;
    	}
    
    	相交个数
    	std::cout << "相交个数" << tree.number_of_intersected_primitives(tri_query) << std::endl;
    
    	获得与tri_query相交的所有图元
    	std::list<Primitive_id> primitives;
    	tree.all_intersected_primitives(tri_query, std::back_inserter(primitives));
    
    	for(std::list<Primitive_id>::iterator it = primitives.begin(); it != primitives.end(); ++it)
    	{
    		const Primitive_id& primitive_id = *it;
    		int index = std::distance(primitives.begin(), it); //第几个
    		std::cout << "第" << index << "个三角形:";
    		std::cout << primitive_id->vertex(0) << ";" << primitive_id->vertex(1) << ";" << primitive_id->vertex(2) << std::endl;
    	}
    
    	第一个相交的图元
    	auto first_intersection_id = tree.any_intersected_primitive(tri_query);
        
    	return EXIT_SUCCESS;
    }
    

    三角网太复杂时,遇到这种问题:初判是精度问题,还不知道如何解决

    在这里插入图片描述

    在这里插入图片描述

    展开全文
  • AABB&OBB碰撞

    万次阅读 2016-12-27 11:50:43
    包围体是一个简单的几何空间,里面包含着复杂形状的物体。为物体添加包围体的目的是快速的进行碰撞检测或者进行精确...包围体类型包括球体、轴对齐包围盒(AABB)、有向包围盒(OBB)、8-DOP以及凸壳。如图1所示。
  • TTT模块 评估不同的碰撞检测算法(AABB,SAT,球体碰撞,八叉,四叉,K)对FPS和处理中模拟的内存使用情况的影响
  • 首先给出了数字样机区域层次,然后设计了基于构建、更新和搜索AABB层次的数字样机空间区域自动计算与搜索算法,最后将研究成果应用于某民用型机的研制。应用表明该方法大大提高了区域数字样机模型的加载效率,...
  • 前面已经说过,均匀空间划分存在一个划分粒度的问题,所以,为了解决这个问题,就出现了基于形结构的空间划分。基于KD-tree进行空间划分就是其中一种 KD-tree每次划分的时候,会按顺序沿着x、y、z轴进行依次划分...
  • Box2D里的AABB

    千次阅读 2012-04-22 16:03:55
    转载自:http://tech.byreach.com/node/2442 AABB的全称是axis aligned bounding box, 大致概念首先是一个box, 也就是一个框框, 这个框框的4边与坐标轴平行, 也就是一个正方形或者长方形区域。
  • Box2d源码学习<六>动态的实现

    千次阅读 2012-12-13 23:44:13
    同时动态树继承自AABB树,树上的每一个节点都有两个孩子。叶节点是一个单独的用户AABB。即便是惰性输入,整个数也可以使用旋转保持平衡。 好了,我们开始上正餐了。先看b2DynameicTree.h文件: //定义空...
  • 四叉和八叉概述

    千次阅读 2014-07-01 10:18:41
    四叉和八叉概述传统计算机图形应用--特别是的应用的需要一个实时,交互的方法来现实--通过处理一个发送到显卡的数据的最有效的图形数据子集的方法来决定图形数据的显示,而不是传送全部的数据,四叉,八叉,...
  • AABB

    2017-10-24 09:24:57
    http://blog.csdn.net/sinat_24229853/article/details/48662799 http://blog.csdn.net/i_dovelemon/article/details/33303473 http://blog.csdn.net/qq_22822335/article/details/50930437
  • 动态模糊 《用一周学习光线追踪》2.BVHAABB相交检测 《用一周学习光线追踪》3.纯色纹理和棋盘纹理 《用一周学习光线追踪》4.柏林噪声 《用一周学习光线追踪》5.球面纹理贴图 《用一周学习光线追踪》6.光照和轴...
  • 借助层次空间分解法的思想,将缝合衣片的相对位置同人模自身的结构信息相结合,灵活地构造人模AABB树,减少了不相交元素的碰撞检测次数,从而提高了算法的效率。最后还给出了实现整个虚拟穿衣过程的具体步骤。...
  • AABB包围盒详解

    千次阅读 2017-05-15 20:43:51
    AABB盒,一个3D的AABB就是一个简单的六面体,每一边都平行于一个坐标平面,矩形边界框不一定都是立方体,它的长、宽、高可以彼此不同。 AABB的重要性质: Ymin Zmin 特别重要的两个顶点为:Pmin = [Xmin Ymin ...
  • 图形学笔记(十一)光线追踪——Shadow Mapping、光线追踪、光线投射、软硬阴影、光线与物体交点、AABB包围盒 文章目录1 使用AABB包围盒加速光线追踪1.1 Uniform Spatial Partitions (Grids)均匀空间划分1.1.1 ...
  • 文档:https://doc.cgal.org/latest/AABB_tree/index.html 文档中关于距离计算的... An AABB tree computes the closest point from a given point query to the input primitives through the function AABB_tree::c
  • 4叉实现的碰撞检测,只有当需检测的物体足够多时候才能发挥其优势
  • Bounds(包围盒)概述与AABB包围盒应用

    万次阅读 2017-04-23 15:35:40
    也就有更少的节点,求交检测时就会减少更多的冗余计算,但相互间的求交运算较为复杂。 2.AABB包围盒在Unity中的拓展 以下这段代码可以添加到静态类中作为Transform的拓展方法可以直接使用 这段代码...
  • AABB和OBB包围盒简介

    千次阅读 2016-07-28 19:17:44
    一、AABB立方体边界框检测 用球体去近似地代表物体运算量很小,但在游戏中的大多数物体是方的或者长条形的,应该用方盒来代表物体。另一种常见的检测模型是立方体边界框,如图10-31展示了一个AABB检测盒和它里面...
  • 目录 前言 一、Demo说明 二、暴力法 三、网格划分 实测 分析 四、四叉树 四叉树的构建细节 实测 五、松散四叉树 实测 八叉树 六、层次包围盒树(BVH) 包围盒 AABB树 AABB树构建细节 实测 总结 前言 碰撞检测是一个...
  • Author: bugallWechat: bugallFEmail: 769088641@qq.comGithub: https://github.com/bugall一:介绍...我们今天主要介绍的就是Dynamic AABB Tree的实现原理,AABB Tree是个二叉树,从名字上看,像是个动态平衡的变种...
  • 通过3D模型顶点计算出它的AABB包围盒的两种不同的方法。
  • 当物体变形之后,包围球需要重新计算。因此,它是使用得比较少的一种包围盒。当对象发生旋转运动时, 包围球不需作任何更新, 这是包围球的较优秀特性; 当几何对象进行频繁的旋转运动时, 采用包围球可能得到较好结果。...
  • 四叉在MMO中的应用

    2019-01-10 11:47:30
    四叉是一种树状数据结构,在每一个节点上会有四个子区块。四叉常应用于二维空间数据的分析与分类。 它将数据区分成为四个象限。数据范围可以是方形或矩形或其他任意形状。 四叉在游戏中常常用于减少遍历的次数...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,877
精华内容 750
关键字:

aabb树

友情链接: Amazon Checker.rar