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

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ⅴ视频| 亚洲精品乱码久久久久久日本蜜臀| 欧美91精品| 99国产精品国产精品毛片| 日韩亚洲不卡在线| 欧美午夜不卡在线观看免费| 亚洲欧美电影在线观看| 亚洲欧美卡通另类91av | 亚洲人成人99网站| 欧美人在线观看| 亚洲综合日韩中文字幕v在线| 亚洲综合国产激情另类一区| 国产在线视频欧美| 亚洲承认在线| 欧美日韩亚洲一区三区| 久久本道综合色狠狠五月| 久久不射电影网| 亚洲精品一区二区三区福利| 在线一区二区三区四区| 国产亚洲精品成人av久久ww| 亚洲大片免费看| 国产精品你懂的| 美女精品自拍一二三四| 欧美日韩在线播放一区二区| 久久国产精品一区二区| 欧美第一黄色网| 久久福利影视| 欧美激情国产高清| 久久久久亚洲综合| 欧美激情一区二区在线| 欧美一级视频| 欧美精品日韩www.p站| 久久精品国产精品亚洲| 欧美乱在线观看| 久热成人在线视频| 国产精品国产精品国产专区不蜜| 免费在线欧美黄色| 国产精品视屏| 亚洲欧洲一区二区三区在线观看| 国产视频一区在线| 99精品视频免费观看| 1204国产成人精品视频| 亚洲欧美一区二区激情| 一本色道久久综合狠狠躁篇的优点 | 亚洲天堂网在线观看| 久久成人免费日本黄色| 亚洲一区二三| 欧美极品欧美精品欧美视频| 久久午夜电影| 国产日韩成人精品| 99re6热在线精品视频播放速度| 在线国产精品一区| 欧美在线视频二区| 午夜精品视频| 国产精品成人国产乱一区| 亚洲区第一页| 亚洲三级色网| 欧美极品在线观看| 亚洲成人资源网| 亚洲国产美女| 蜜桃伊人久久| 欧美高清在线视频| 亚洲国产毛片完整版| 久久深夜福利| 欧美大片专区| 亚洲人成在线观看一区二区| 久久综合色播五月| 亚洲电影av在线| 亚洲日本中文字幕| 欧美激情亚洲国产| 亚洲老板91色精品久久| 亚洲视频成人| 国产精品久久久久7777婷婷| 亚洲一卡二卡三卡四卡五卡| 午夜欧美大尺度福利影院在线看| 国产精品视频午夜| 性色av一区二区三区红粉影视| 欧美一区三区二区在线观看| 国产亚洲欧美一区在线观看| 欧美制服第一页| 欧美电影免费观看高清| 亚洲美女黄网| 国产精品黄页免费高清在线观看| 亚洲自拍偷拍视频| 久久青青草综合| 亚洲国产美女精品久久久久∴| 欧美激情偷拍| 亚洲欧美激情在线视频| 另类欧美日韩国产在线| 亚洲精品一区二区三区蜜桃久| 欧美日韩精品在线| 亚洲欧美国产日韩天堂区| 另类人畜视频在线| aa级大片欧美三级| 国产精品一区毛片| 玖玖玖国产精品| 一本一本久久a久久精品牛牛影视| 欧美亚洲在线观看| 亚洲黄色av一区| 国产精品一区二区久激情瑜伽| 久久亚洲精选| 宅男在线国产精品| 欧美91大片| 午夜精品亚洲| 亚洲经典自拍| 国产拍揄自揄精品视频麻豆| 欧美成人精品在线观看| 亚洲自啪免费| 亚洲精品一区在线| 久久欧美中文字幕| 亚洲一区二区在线免费观看视频| 激情成人中文字幕| 国产精品久久久久婷婷| 麻豆成人在线| 欧美中文字幕| 亚洲一品av免费观看| 亚洲国产综合在线| 久久久久久免费| 亚洲欧美日韩成人高清在线一区| 亚洲激情在线激情| 国产亚洲一二三区| 国产精品久久久爽爽爽麻豆色哟哟| 久久先锋资源| 久久精品一区四区| 亚洲无限av看| 亚洲精品在线视频| 欧美国产视频一区二区| 久久久五月天| 久久99伊人| 午夜在线视频一区二区区别| 99国产精品视频免费观看一公开| 亚洲国产成人91精品| 韩国精品在线观看| 国产一区二区欧美日韩| 国产精品天天摸av网| 欧美性一二三区| 欧美日韩一区免费| 欧美日韩成人综合天天影院| 欧美大片免费观看在线观看网站推荐| 欧美一区二区视频在线观看| 性做久久久久久久久| 午夜精彩视频在线观看不卡| 亚洲一区二区三区高清| 亚洲一区二区三区乱码aⅴ蜜桃女| 99re6这里只有精品视频在线观看| 亚洲国产人成综合网站| 亚洲激情啪啪| 亚洲人成人一区二区在线观看 | 亚洲一区二区欧美日韩| 一区二区三区免费看| 99re66热这里只有精品4| 亚洲精品欧美专区| 一本久道久久综合中文字幕| 夜色激情一区二区| 一区二区三区精品久久久| 亚洲特黄一级片| 午夜精品免费| 久久久综合精品| 欧美电影专区| 亚洲人成网站999久久久综合| 亚洲精品欧美日韩专区| 一本大道久久精品懂色aⅴ| 亚洲先锋成人| 久久精品一区二区三区四区 | 欧美在线观看日本一区| 久久久av毛片精品| 欧美成人综合在线| 欧美日韩综合精品| 国产欧美视频一区二区三区| 精品成人一区| 99视频+国产日韩欧美| 亚洲图片在线| 久久久久久精| 最新国产拍偷乱拍精品| 亚洲午夜高清视频| 久久久久久久久久久久久9999| 欧美成人免费在线| 国产麻豆一精品一av一免费| 亚洲激情视频在线| 性欧美xxxx大乳国产app| 美女图片一区二区| 99热这里只有成人精品国产| 欧美一区2区三区4区公司二百| 蜜月aⅴ免费一区二区三区| 国产精品美女久久久久av超清| 一区二区在线免费观看| 亚洲一区二区免费在线| 欧美a一区二区| 亚洲影院在线观看| 欧美搞黄网站| 国产综合色一区二区三区 | 国产亚洲综合在线| 一本久道久久久| 久久午夜电影网| 亚洲午夜电影在线观看| 欧美韩国日本一区| 在线观看欧美日本| 欧美一区二区久久久|