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

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二区| 亚洲电影免费观看高清完整版| 老司机亚洲精品| 欧美高清视频在线| 日韩午夜av电影| 亚洲免费成人av电影| 欧美日韩亚洲一区三区| 欧美一级久久久久久久大片| 午夜精品影院| 亚洲国产裸拍裸体视频在线观看乱了| 欧美激情在线观看| 欧美日韩中文字幕在线视频| 久久国产色av| 欧美成人四级电影| 亚洲视频欧美在线| 欧美一区二区三区视频免费播放| 狠狠色伊人亚洲综合成人| 亚洲高清在线观看| 国产精品视频免费一区| 蜜桃久久av一区| 欧美日韩免费高清一区色橹橹| 亚洲午夜激情| 久久人体大胆视频| 亚洲欧美视频在线观看| 欧美在线看片a免费观看| 最近看过的日韩成人| 亚洲综合色激情五月| 亚洲国产清纯| 欧美一区二区三区在线免费观看| 亚洲国产精品成人| 亚洲先锋成人| 亚洲精品日韩综合观看成人91| 在线亚洲一区| 亚洲伦理久久| 性伦欧美刺激片在线观看| 亚洲精品影院| 久久免费偷拍视频| 欧美一区二区精品久久911| 欧美激情亚洲激情| 久久综合一区二区| 国产精品www网站| 亚洲国产色一区| 精品动漫av| 香港久久久电影| 亚洲欧美中文字幕| 欧美日韩1区2区| 亚洲电影免费观看高清完整版 | 中文亚洲视频在线| 亚洲国产日韩一区二区| 欧美伊久线香蕉线新在线| 99亚洲一区二区| 免费中文字幕日韩欧美| 狂野欧美激情性xxxx| 国产区欧美区日韩区| 中文在线一区| 亚洲一二三区在线| 欧美日韩成人在线视频| 亚洲激情啪啪| 亚洲精选一区| 欧美精品一区二区三区很污很色的| 毛片精品免费在线观看| 国内精品久久久久久久影视麻豆| 午夜精品在线视频| 欧美在线观看日本一区| 国产欧美91| 欧美在线免费观看| 久久亚洲综合色| 亚洲福利免费| 欧美aⅴ一区二区三区视频| 欧美大片在线观看| 亚洲人成人一区二区三区| 欧美激情网站在线观看| 亚洲精品中文在线| 亚洲在线不卡| 国产亚洲欧美日韩在线一区| 欧美与欧洲交xxxx免费观看 | 亚洲一区bb| 国产精品久久久久久久久免费樱桃 | 99国产麻豆精品| 欧美日韩视频在线一区二区| 亚洲最新中文字幕| 亚洲欧美日韩精品久久久久| 国产精品一区免费观看| 午夜欧美大片免费观看| 久久婷婷蜜乳一本欲蜜臀| 在线观看日韩www视频免费| 欧美**字幕| 中文高清一区| 久久一区二区三区国产精品| 91久久在线| 国产精品区一区二区三区| 午夜亚洲精品| 欧美二区不卡| 亚洲欧美国产日韩天堂区| 国产午夜精品一区二区三区视频 | 国产日本欧美一区二区三区| 久久精品成人| 亚洲美女视频网| 久久成人免费电影| 亚洲人成网站777色婷婷| 国产精品久久一卡二卡| 久久精品中文| 99精品免费视频| 免费欧美电影| 欧美一区二区三区四区夜夜大片| 亚洲电影在线观看| 国产精品国产三级国产普通话蜜臀| 欧美在线免费观看视频| 亚洲精品护士| 欧美成人精品1314www| 亚洲一区免费观看| 亚洲国产欧美日韩另类综合| 国产精品影院在线观看| 欧美精品一区二| 久久国产66| 亚洲综合色自拍一区| 亚洲黄网站黄| 欧美波霸影院| 久久久国产精品一区| 亚洲午夜精品视频| 日韩亚洲不卡在线| 在线观看视频一区| 国产亚洲欧美激情| 国产精品美女主播| 欧美另类一区二区三区| 久久青青草原一区二区| 亚洲男女毛片无遮挡| 99re6热只有精品免费观看| 牛牛精品成人免费视频| 久久婷婷国产麻豆91天堂| 羞羞漫画18久久大片| 亚洲综合色丁香婷婷六月图片| 日韩视频精品在线| 亚洲国产天堂久久综合网| 国产曰批免费观看久久久| 国产欧美二区| 国产女主播一区二区| 国产精品外国| 国产欧美一区二区精品婷婷 | 国产精品爽爽ⅴa在线观看| 欧美精品九九99久久| 欧美成人在线网站| 欧美成人小视频| 欧美国产激情| 欧美国产视频日韩| 欧美国产一区视频在线观看| 欧美sm极限捆绑bd| 欧美va日韩va| 欧美日韩国产首页在线观看| 欧美电影免费观看网站| 欧美激情一区二区三区在线视频 | 免费欧美视频| 欧美成人一区二区三区| 欧美精品乱码久久久久久按摩| 欧美激情亚洲视频| 欧美日韩国产另类不卡| 欧美日韩综合在线| 国产日韩一区二区| 激情六月婷婷久久| 亚洲蜜桃精久久久久久久| 亚洲视频网站在线观看| 午夜国产精品影院在线观看 | 91久久综合| 亚洲午夜久久久| 久久爱www| 欧美黑人一区二区三区| 亚洲精品久久久久久下一站| 亚洲一区二区三区在线| 久久精品国产久精国产思思| 欧美不卡福利| 国产精品一区2区| 亚洲国产精品va在线观看黑人| 一区二区冒白浆视频| 午夜一级久久| 欧美激情在线播放| 国产精品99久久不卡二区| 久久国产精品99国产| 免费一级欧美在线大片| 国产精品福利久久久| 亚洲高清一区二| 性亚洲最疯狂xxxx高清| 欧美成人免费观看| 亚洲综合欧美日韩| 欧美成年人视频网站欧美| 国产美女精品免费电影| 亚洲国内自拍| 久久国产成人| 99re6热在线精品视频播放速度| 久久精品国产久精国产思思| 欧美无砖砖区免费| 亚洲国产精品黑人久久久| 先锋影音久久| 999亚洲国产精| 狂野欧美一区| 国户精品久久久久久久久久久不卡 | 欧美日韩美女在线| 亚洲国产mv|