青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

eryar

PipeCAD - Plant Piping Design Software.
RvmTranslator - Translate AVEVA RVM to OBJ, glTF, etc.
posts - 603, comments - 590, trackbacks - 0, articles - 0

Bounding Volume Hierarchy BVH in OpenCASCADE

Posted on 2017-05-03 22:50 eryar 閱讀(6452) 評論(0)  編輯 收藏 引用 所屬分類: 2.OpenCASCADE

Bounding Volume Hierarchy BVH in OpenCASCADE

eryar@163.com

Abstract. Bounding Volume Hierarchy(BVH) organizes geometric objects in the tree based on spatial relationships. Each node in the tree contains an axis-aligned bounding box of all the objects below it. Bounding volume hierarchies are used in many algorithms to support efficient operations on the sets of geometric objects, such as collision detection, ray-tracing, searching of nearest objects, and view frustum culling. The paper focus on the usage of BVH on TopoDS_Shape, and its application.

Key Words. BVH, Bounding Volume Hierarchy, Collision Detection

1.Introduction

層次包圍盒(Bounding Volume Hierarchy, BVH)是一種基于物體的場景管理技術,廣泛用于碰撞檢測,光線追蹤,視錐體物體剔除等場合。對于三維場景的實時渲染來說,BVH是最常用的數據結構。場景以層次樹形結構進行組織,包含一個根節點、內部節點、葉子節點。樹中的每個節點,包括葉子節點都有一個包圍體,可以將其子樹的所有幾何體包圍起來,這就是BVH名字的由來。如下圖所示:

wps9752.tmp

Figure 1. Simple Scene(left), BVH Scene Graph(right)

本文主要介紹OpenCASCADE中的BVH包及其應用,如碰撞檢測。

2.Build BVH

在BVH包中的頭文件里面找到BVH的作者:Denis BOGOLEPOV, Danila ULYANOV,在網上搜到他們的一篇論文:Real-Time SAH BVH Construction for Ray Tracing Dynamic Scenes. 因此,可知BVH中是應用SAH(Surface Area Heuristic)策略來構造BVH樹的。根據BVH_BinnedBuilder頭文件中的注釋可知:

//! Performs construction of BVH tree using binned SAH algorithm. Number
//! of bins controls BVH quality in cost of construction time (greater
//! better). For optimal results, use 32 - 48 bins. However, reasonable
//! performance is provided even for 4 - 8 bins (it is only 10-20% lower
//! in comparison with optimal settings). Note that multiple threads can
//! be used only with thread safe BVH primitive sets.

OpenCASCADE中也提供了其他的構造方法,如類BVH_LinearBuilder中使用了Spatial Morton codes方法:

//! Performs fast BVH construction using LBVH building approach.
//! Algorithm uses spatial Morton codes to reduce the BVH construction
//! problem to a sorting problem (radix sort -- O(N) complexity). This
//! Linear Bounding Volume Hierarchy (LBVH) builder produces BVH trees
//! of lower quality compared to SAH-based BVH builders but it is over
//! an order of magnitude faster (up to 3M triangles per second).
//!
//! For more details see:
//! C. Lauterbach, M. Garland, S. Sengupta, D. Luebke, and D. Manocha.
//! Fast BVH construction on GPUs. Eurographics, 2009.

3.Traversal BVH

由類BVH_TreeBase可知,當得到BVH樹后,可以取出節點索引的數組。下面給出將TopoDS_Shape的BVH樹顯示出來的示例代碼:

/*
Copyright(C) 2017 Shing Liu(eryar@163.com)

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files(the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and / or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions :

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
*/

// Visual Studio 2013 & OpenCASCADE7.1.0
// 2017-04-18  20:52 

#include <BRepExtrema_TriangleSet.hxx>

#include <BRepTools.hxx>
#include <BRep_Builder.hxx>

#include <TopoDS.hxx>

#include <TopExp_Explorer.hxx>

#include <BRepPrimAPI_MakeBox.hxx>

#include <BRepMesh_IncrementalMesh.hxx>

#pragma comment(lib, "TKernel.lib")
#pragma comment(lib, "TKMath.lib")

#pragma comment(lib, "TKG2d.lib")
#pragma comment(lib, "TKG3d.lib")
#pragma comment(lib, "TKGeomBase.lib")
#pragma comment(lib, "TKGeomAlgo.lib")

#pragma comment(lib, "TKBRep.lib")
#pragma comment(lib, "TKPrim.lib")
#pragma comment(lib, "TKMesh.lib")
#pragma comment(lib, "TKTopAlgo.lib")


void testBvh(const std::string& theFileName)
{
    BRep_Builder aBuilder;
    TopoDS_Compound aCompound;

    TopoDS_Shape aShape;
    BRepTools::Read(aShape, theFileName.c_str(), aBuilder);

    BRepExtrema_ShapeList aFaceList;
    for (TopExp_Explorer i(aShape, TopAbs_FACE); i.More(); i.Next())
    {
        aFaceList.Append(TopoDS::Face(i.Current()));
    }

    aBuilder.MakeCompound(aCompound);

    BRepMesh_IncrementalMesh aMesher(aShape, 1.0);

    BRepExtrema_TriangleSet aTriangleSet(aFaceList);
    const NCollection_Handle<BVH_Tree<Standard_Real, 3> >& aBvh = aTriangleSet.BVH();
    for (int i = 0; i < aBvh->Length(); i++)
    {
        const BVH_Vec4i& aNodeData = aBvh->NodeInfoBuffer()[i];

        if (aNodeData.x() == 0)
        {
            // inner node.
            const BVH_Vec3d& aP1 = aBvh->MinPoint(aNodeData.y());
            const BVH_Vec3d& aP2 = aBvh->MaxPoint(aNodeData.y());

            const BVH_Vec3d& aQ1 = aBvh->MinPoint(aNodeData.z());
            const BVH_Vec3d& aQ2 = aBvh->MaxPoint(aNodeData.z());

            try
            {
                BRepPrimAPI_MakeBox aBoxMaker(gp_Pnt(aP1.x(), aP1.y(), aP1.z()),
                    gp_Pnt(aP2.x(), aP2.y(), aP2.z()));
                for (TopExp_Explorer i(aBoxMaker.Shape(), TopAbs_EDGE); i.More(); i.Next())
                {
                    aBuilder.Add(aCompound, i.Current());
                }
            }
            catch (Standard_Failure f)
            {
            }

            try
            {
                BRepPrimAPI_MakeBox aBoxMaker(gp_Pnt(aQ1.x(), aQ1.y(), aQ1.z()),
                    gp_Pnt(aQ2.x(), aQ2.y(), aQ2.z()));
                for (TopExp_Explorer i(aBoxMaker.Shape(), TopAbs_EDGE); i.More(); i.Next())
                {
                    aBuilder.Add(aCompound, i.Current());
                }
            }
            catch (Standard_Failure f)
            {
            }
        }
        else
        {
            // leaves node.
            const BVH_Vec3d& aP1 = aBvh->MinPoint(i);
            const BVH_Vec3d& aP2 = aBvh->MaxPoint(i);

            try
            {
                BRepPrimAPI_MakeBox aBoxMaker(gp_Pnt(aP1.x(), aP1.y(), aP1.z()),
                    gp_Pnt(aP2.x(), aP2.y(), aP2.z()));

                aBuilder.Add(aCompound, aBoxMaker.Shape());
            }
            catch (Standard_Failure f)
            {
            }
        }
    }

    BRepTools::Write(aCompound, "d:/bvh.brep");
}

int main(int argc, char* argv[])
{
    if (argc > 1)
    {
        testBvh(argv[1]);
    }

    return 0;
}

由上述代碼可知,當得到節點信息

const BVH_Vec4i& aNodeData = aBvh->NodeInfoBuffer()[i];

后,通過判斷aNodeData.x()分量來確定此節點是內部節點還是葉子節點。顯示OCC自帶的螺旋槳模型的BVH如下圖所示:

wps9772.tmp

wps9773.tmp

其中紅色線框為內部節點,黃色實體模型是葉子節點。

wps9774.tmp

wps9775.tmp

4.BVH Application

BVH在OpenCASCADE中也有廣泛地應用,如開源版本中的模型快速碰撞檢測,使用類BRepExtrema_ShapeProximity. 模型選擇操作,光線跟蹤等算法中都有應用。

5.Conclusion

因為OpenCASCADE中構造BVH時依賴模型的網格三角形,所以BVH算法的應用的結果就依賴于網格化算法的質量了。如兩個Topo形狀碰撞檢測時,網格化的質量越高,結果精度越高。如果用解析算法去對兩個Topo形狀做碰撞檢測,也會涉及到解析算法的精度問題。

BVH結構廣泛應用于碰撞檢測、光線跟蹤等算法中,大大提高程序性能。本文只是拋磚引玉,對BVH感興趣的童鞋可以參考相關資料及OpenCASCADE中的代碼實現,去深入學習應用。

6.References

1. Dmitry Sopin, Denis Bogolepov, Danila Ulyanov. Real-Time SAH BVH Construction for Ray Tracing Dynamic Scenes. http://graphicon.ru/html/2011/conference/gc2011Sopin.pdf

2. BVH with SAH. http://www.cnblogs.com/lookof/p/3546320.html

3. 3D游戲引擎中常見的三維場景管理方法. http://www.cnblogs.com/wangchengfeng/p/3495954.html

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美人与性动交cc0o| 久久gogo国模啪啪人体图| 欧美日韩在线免费观看| 欧美激情在线免费观看| 欧美激情一区二区三区蜜桃视频| 蜜臀av国产精品久久久久| 免费成人毛片| 亚洲最新视频在线| 亚洲精品综合| 亚洲午夜激情| 久久不射电影网| 嫩草国产精品入口| 最新中文字幕一区二区三区| 美女黄毛**国产精品啪啪| 欧美激情亚洲| 亚洲视频专区在线| 亚洲视频在线播放| 欧美一区二区高清| 欧美国产精品久久| 中文精品视频| 久久影院亚洲| 欧美日韩一区二区三区四区在线观看| 欧美日韩精品免费在线观看视频| 国产精品高潮呻吟久久av无限 | 亚洲黄色一区二区三区| 在线视频日韩精品| 欧美有码在线视频| 欧美精品一区二区三区蜜桃 | 国产精品白丝jk黑袜喷水| 一区二区三区成人精品| 久久久人成影片一区二区三区观看| 欧美激情 亚洲a∨综合| 国产伦精品一区二区三区免费 | 欧美日韩理论| 影音先锋亚洲电影| 亚洲欧美视频在线观看视频| 免费久久精品视频| 亚洲一区观看| 欧美激情一级片一区二区| 国产欧美日韩精品一区| 日韩视频精品在线| 欧美激情国产日韩| 欧美资源在线| 国产女主播一区二区| 亚洲婷婷免费| 亚洲乱码国产乱码精品精 | 国产精品综合av一区二区国产馆| 亚洲精品国产精品国自产观看浪潮 | 欧美色偷偷大香| 亚洲激情欧美激情| 久久综合久久88| 午夜久久tv| 国产精品专区h在线观看| 国产精品毛片| 欧美成人免费全部观看天天性色| 国产午夜精品美女毛片视频| 香蕉免费一区二区三区在线观看| 亚洲精品欧美日韩| 欧美久久一级| 99re视频这里只有精品| 亚洲国产精品成人综合| 免费观看亚洲视频大全| 亚洲黄色大片| 91久久久久久久久| 欧美精品日韩综合在线| 一区二区久久久久久| 亚洲免费高清| 国产精品久久久久一区二区三区共 | 亚洲天堂av高清| 国产精品第2页| 香蕉乱码成人久久天堂爱免费| 亚洲一区二区在线免费观看视频 | 免费久久99精品国产自| 蜜桃av一区二区| 亚洲精品日韩综合观看成人91 | 久久九九精品| 亚洲精品免费看| 日韩亚洲不卡在线| 国产精品福利在线观看| 欧美中文在线观看| 久久在精品线影院精品国产| 亚洲欧洲精品天堂一级| 99re6这里只有精品视频在线观看| 国产精品国产三级国产专播精品人| 亚洲与欧洲av电影| 欧美一区二区三区免费视| 伊人久久亚洲影院| 99pao成人国产永久免费视频| 国产日本欧美一区二区三区| 欧美大成色www永久网站婷| 欧美久久久久| 久久美女艺术照精彩视频福利播放| 久久综合九色欧美综合狠狠| 亚洲私人影院在线观看| 欧美制服丝袜第一页| 日韩亚洲精品视频| 久久国产免费看| 亚洲深夜福利| 久久久免费av| 香蕉av福利精品导航| 免费成年人欧美视频| 午夜精品久久久久久久99樱桃 | 午夜激情综合网| 亚洲高清久久| 99天天综合性| 在线视频亚洲| 亚洲国产电影| 国产一区二区三区在线观看免费视频| 美女免费视频一区| 国产精品一区二区在线观看不卡| 欧美成人精品高清在线播放| 国产精品国产三级国产a| 欧美激情一二区| 国内精品久久久久影院薰衣草| 99视频+国产日韩欧美| 亚洲国产国产亚洲一二三| 亚洲影院色在线观看免费| 亚洲精品之草原avav久久| 久久久7777| 欧美亚洲一区二区在线观看| 欧美精品在线免费| 欧美国产极速在线| 亚洲国产第一| 久久在线免费观看| 久久久www免费人成黑人精品| 欧美私人网站| 亚洲精品综合| 日韩系列在线| 欧美精品一区在线观看| 亚洲欧洲一区二区在线播放 | 欧美国产日韩一二三区| 久久视频精品在线| 国产亚洲福利一区| 亚洲午夜高清视频| 亚洲欧美欧美一区二区三区| 欧美日韩在线电影| 亚洲人久久久| 9i看片成人免费高清| 欧美成人在线免费观看| 欧美高清在线| 亚洲欧洲日本mm| 男人天堂欧美日韩| 亚洲第一中文字幕| 日韩午夜在线电影| 欧美三级第一页| 亚洲图色在线| 欧美在线一级视频| 一区二区三区在线免费播放| 久久久91精品国产| 欧美激情在线有限公司| 日韩视频在线观看国产| 欧美视频精品在线| 亚洲一区区二区| 久久经典综合| 影音先锋日韩精品| 欧美国产日韩亚洲一区| 亚洲特黄一级片| 久久另类ts人妖一区二区| 亚洲青色在线| 国产精品久久久久久一区二区三区| 亚洲免费在线电影| 麻豆久久精品| 一区二区三区毛片| 国产欧美日韩亚州综合| 麻豆av一区二区三区久久| 99精品久久| 免费不卡在线观看| 亚洲视频在线观看| 国内久久精品视频| 欧美日韩国产综合一区二区| 午夜激情综合网| 亚洲日本va午夜在线影院| 久久久久久亚洲综合影院红桃 | 国产欧美一区视频| 久久在线视频在线| 99re国产精品| 欧美成人国产一区二区| 夜夜嗨网站十八久久| 国产视频精品va久久久久久| 欧美成人综合网站| 午夜一区不卡| 亚洲精品男同| 老司机午夜精品| 亚洲欧美春色| 亚洲青涩在线| 精品福利电影| 国产精品欧美日韩一区二区| 欧美成人综合一区| 午夜视黄欧洲亚洲| 日韩视频在线免费观看| 免播放器亚洲| 久久精品亚洲热| 亚洲欧美在线另类| 亚洲作爱视频| 最近中文字幕日韩精品| 韩国精品主播一区二区在线观看| 国产精品乱人伦一区二区 | 久久视频在线看| 亚洲欧美日韩在线高清直播| 亚洲精品中文字幕有码专区|