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

eryar

PipeCAD - Plant Piping Design Software.
PlantAssistant - Translate AVEVA RVM/SP3D VUE to glTF, STEP, etc.
posts - 606, comments - 590, trackbacks - 0, articles - 0

Bounding Volume Hierarchy BVH in OpenCASCADE

Posted on 2017-05-03 22:50 eryar 閱讀(6497) 評論(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)是一種基于物體的場景管理技術(shù),廣泛用于碰撞檢測,光線追蹤,視錐體物體剔除等場合。對于三維場景的實時渲染來說,BVH是最常用的數(shù)據(jù)結(jié)構(gòu)。場景以層次樹形結(jié)構(gòu)進(jìn)行組織,包含一個根節(jié)點、內(nèi)部節(jié)點、葉子節(jié)點。樹中的每個節(jié)點,包括葉子節(jié)點都有一個包圍體,可以將其子樹的所有幾何體包圍起來,這就是BVH名字的由來。如下圖所示:

wps9752.tmp

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

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

2.Build BVH

在BVH包中的頭文件里面找到BVH的作者:Denis BOGOLEPOV, Danila ULYANOV,在網(wǎng)上搜到他們的一篇論文:Real-Time SAH BVH Construction for Ray Tracing Dynamic Scenes. 因此,可知BVH中是應(yīng)用SAH(Surface Area Heuristic)策略來構(gòu)造BVH樹的。根據(jù)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中也提供了其他的構(gòu)造方法,如類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可知,當(dāng)?shù)玫紹VH樹后,可以取出節(jié)點索引的數(shù)組。下面給出將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;
}

由上述代碼可知,當(dāng)?shù)玫焦?jié)點信息

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

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

wps9772.tmp

wps9773.tmp

其中紅色線框為內(nèi)部節(jié)點,黃色實體模型是葉子節(jié)點。

wps9774.tmp

wps9775.tmp

4.BVH Application

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

5.Conclusion

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

BVH結(jié)構(gòu)廣泛應(yīng)用于碰撞檢測、光線跟蹤等算法中,大大提高程序性能。本文只是拋磚引玉,對BVH感興趣的童鞋可以參考相關(guān)資料及OpenCASCADE中的代碼實現(xiàn),去深入學(xué)習(xí)應(yīng)用。

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>
            亚洲在线一区二区| 一本色道久久加勒比精品| 国产亚洲一区二区三区| 精品av久久久久电影| 日韩视频精品在线| 欧美在线看片a免费观看| 久久综合狠狠综合久久综合88| 欧美国产日韩一区| 亚洲一区二区免费视频| 国产精品久久久久久久久久免费 | 一区二区三区你懂的| 久久国产精品一区二区三区四区 | 欧美亚洲综合网| 欧美日韩1区| 亚洲电影免费观看高清完整版在线| 一区二区免费看| 欧美成人激情视频免费观看| 午夜精品视频网站| 国产精品v欧美精品∨日韩| 亚洲电影免费观看高清完整版在线观看| 欧美高清hd18日本| 久久成人国产精品| 亚洲欧洲午夜| 美日韩丰满少妇在线观看| 午夜精品在线| 亚洲国产视频一区二区| 久久久xxx| 欧美一区视频在线| 国产精品初高中精品久久| 欧美一区二区三区的| 国产精品99久久久久久白浆小说| 欧美日韩视频免费播放| 亚洲色无码播放| 亚洲精品麻豆| 免费影视亚洲| 欧美日韩1区2区3区| 久久国产欧美精品| 欧美一区二区黄| 99热免费精品在线观看| 亚洲人成啪啪网站| 国产午夜亚洲精品羞羞网站| 欧美在线地址| 欧美精品一区二| 亚洲天堂成人在线观看| 久久精品水蜜桃av综合天堂| 亚洲第一在线综合在线| 中国av一区| 亚洲日本aⅴ片在线观看香蕉| 国产精品日韩在线观看| 午夜精品久久久久久久蜜桃app | 美女主播一区| 亚洲国产第一页| 亚洲激情中文1区| 欧美日韩一区二区三区在线| 久色成人在线| 欧美激情视频免费观看| 久久夜色精品| 国产热re99久久6国产精品| 久久久爽爽爽美女图片| 麻豆精品视频在线| 久久久国产精品亚洲一区| 国产精品久久中文| 亚洲精品美女| 99精品视频一区| 欧美成年人视频| 亚洲欧美经典视频| 久久天天综合| 亚洲图片你懂的| 欧美日韩国产一区精品一区 | 久久久久国内| 国产美女精品一区二区三区| 欧美大片网址| 亚洲第一中文字幕| 另类图片国产| 欧美一级二区| 欧美日韩国产在线| 亚洲免费不卡| 亚洲福利视频免费观看| 久久久久久久久综合| 亚洲欧美日韩精品| 国产精品视频在线观看| 亚洲香蕉成视频在线观看| 亚洲国产成人高清精品| 久久婷婷蜜乳一本欲蜜臀| 女人色偷偷aa久久天堂| 亚洲国产精品第一区二区| 免费在线欧美视频| 久久欧美肥婆一二区| 激情欧美一区二区| 免费看精品久久片| 99国产精品一区| 亚洲国产另类久久久精品极度| 久久综合国产精品| 亚洲精品自在久久| 亚洲国产成人久久| 欧美日韩国产三区| 亚洲欧美日韩国产| 亚洲一区二区黄| 欧美电影在线播放| 亚洲图片欧美一区| 久久天堂精品| 99re66热这里只有精品4| 欧美三级网址| 99精品视频一区| 欧美中文字幕在线观看| 91久久久亚洲精品| 国产精品久久久久77777| 久久精品2019中文字幕| 亚洲精品中文字幕在线| 久久国产精品一区二区| 99视频精品| 国产亚洲欧美激情| 欧美日韩一卡| 久久看片网站| 亚洲欧美日韩中文播放| 亚洲国产小视频在线观看| 亚洲精品视频一区| 欧美精品成人91久久久久久久| 午夜精品久久久| 日韩一级片网址| 欧美成人高清| 久久国产乱子精品免费女| 一区二区三区国产| 亚洲电影视频在线| 国产精品一级| 欧美日韩一区二区三区四区在线观看 | 久久一区免费| 欧美一级久久| 亚洲天堂av高清| 亚洲国产精品久久精品怡红院| 久久久精品欧美丰满| 亚洲一区二区动漫| aa国产精品| 亚洲黄色在线看| 激情国产一区| 国内揄拍国内精品久久| 久久综合久色欧美综合狠狠| 亚洲一区二区免费看| 99国产精品久久久久老师| 亚洲黄一区二区| 欧美~级网站不卡| 久久综合给合久久狠狠狠97色69| 欧美一区在线看| 欧美一区国产在线| 欧美一区二区视频在线观看2020 | 国产精品久久久久久久久免费樱桃| 欧美高清不卡在线| 亚洲午夜激情网站| 亚洲精品日韩综合观看成人91| 欧美成人小视频| 欧美成人国产va精品日本一级| 久久亚洲精品网站| 久久中文久久字幕| 毛片一区二区三区| 久久综合色影院| 男人的天堂成人在线| 老**午夜毛片一区二区三区| 久久精品免费看| 久久久99国产精品免费| 久久精品日产第一区二区| 久久午夜av| 欧美国产综合一区二区| 亚洲欧洲精品一区二区三区| 亚洲精品综合| 亚洲一区二区三区欧美| 午夜久久一区| 久久夜色精品国产噜噜av| 免费看亚洲片| 欧美午夜精品久久久久久久| 国产精品亚洲аv天堂网| 国产综合婷婷| 国产精品中文字幕欧美| 国内偷自视频区视频综合| 在线观看日韩www视频免费| 国产精品日韩一区| 国产亚洲精品综合一区91| 一区二区亚洲| 日韩视频在线观看| 欧美一区二区三区在线看| 久久只精品国产| 亚洲老司机av| 性做久久久久久久久| 欧美va亚洲va国产综合| 欧美午夜视频在线观看| 国产日韩欧美三区| 亚洲欧洲一区二区三区在线观看 | 极品中文字幕一区| 99热这里只有精品8| 久久精品人人做人人爽电影蜜月| 欧美成年人视频网站| 一区二区福利| 另类欧美日韩国产在线| 国产精品美女久久久久久免费| 亚洲国产精品专区久久| 亚洲在线第一页| 亚洲综合导航| 亚洲二区视频| 亚洲精品久久久久久久久久久久 | 亚洲国产一区视频| 午夜精品国产|