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

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>
            亚洲欧美国产视频| 久久久精品tv| 日韩一二三在线视频播| 欧美激情一区二区三区四区| 日韩午夜免费| 一区二区福利| 国内精品久久久久久久影视麻豆| 久久夜色精品国产| 免费成人小视频| 亚洲私拍自拍| 欧美亚洲综合在线| 91久久综合亚洲鲁鲁五月天| 91久久精品国产91性色| 欧美日韩成人一区二区三区| 亚洲一卡久久| 欧美在线精品一区| 亚洲精品综合精品自拍| 亚洲天堂成人在线视频| 精品成人在线观看| 日韩视频免费观看高清在线视频 | 亚洲一区观看| 亚洲成人影音| 亚洲一区二区三区精品在线观看| 国产一区二区高清| 亚洲欧洲精品一区二区三区| 国产精品久久久久91| 麻豆成人综合网| 国产精品极品美女粉嫩高清在线 | 亚洲国产一区二区视频| 国产精品日本欧美一区二区三区| 久久这里只精品最新地址| 欧美日韩成人一区二区三区| 久久久综合免费视频| 欧美日韩国产精品一区| 老司机免费视频一区二区| 欧美日韩国产综合视频在线观看中文 | 久久成人在线| 亚洲视频二区| 免费观看久久久4p| 久久九九全国免费精品观看| 欧美三级视频| 亚洲欧洲免费视频| 亚洲第一二三四五区| 亚洲欧美视频一区二区三区| 99精品国产高清一区二区| 久久另类ts人妖一区二区| 欧美一区午夜精品| 欧美午夜宅男影院在线观看| 欧美高清视频在线| 伊人激情综合| 久久久99国产精品免费| 欧美自拍丝袜亚洲| 国产精品久久久免费| 亚洲精品国产精品国产自| 在线免费观看日本欧美| 欧美一区二区精品在线| 午夜精彩视频在线观看不卡 | 欧美成人精品在线| 欧美www视频在线观看| 国产日韩精品视频一区二区三区| 99re热精品| 中文日韩在线视频| 欧美日韩成人一区二区三区| 亚洲青色在线| 日韩午夜剧场| 欧美日韩色一区| av72成人在线| 亚洲欧美中文日韩v在线观看| 欧美日韩三区| 国产精品99久久久久久宅男| 亚洲制服欧美中文字幕中文字幕| 欧美揉bbbbb揉bbbbb| 亚洲午夜国产成人av电影男同| 亚洲一区二区三区高清不卡| 国产精品第一区| 亚洲一区二区在线观看视频| 欧美在线亚洲在线| 在线观看三级视频欧美| 久久在精品线影院精品国产| 免费在线国产精品| 日韩视频中文字幕| 欧美视频专区一二在线观看| 亚洲影院色无极综合| 久久久久久91香蕉国产| 在线免费日韩片| 欧美精品亚洲一区二区在线播放| 日韩亚洲视频在线| 久久精品国产亚洲高清剧情介绍| 韩国欧美一区| 欧美日韩p片| 亚洲欧美日韩国产一区| 蜜臀久久99精品久久久久久9| 日韩视频在线观看| 国产日韩欧美91| 免费高清在线视频一区·| 99精品国产高清一区二区| 性欧美超级视频| 亚洲国产精品一区在线观看不卡 | 欧美黄免费看| 亚洲欧美成人精品| 欧美福利在线| 欧美一区二区视频在线观看| 在线免费日韩片| 国产精品久久国产精品99gif| 久久国产欧美精品| 日韩午夜精品| 欧美成人一区二区三区| 亚洲欧美另类综合偷拍| 亚洲国产另类久久久精品极度| 欧美日韩在线播放一区| 久久精品毛片| 亚洲一区三区在线观看| 欧美国产激情| 久久久久久久波多野高潮日日| 一本一道久久综合狠狠老精东影业 | 亚洲国产日韩一区| 久久久久久久高潮| 亚洲免费在线观看视频| 亚洲激情av| 国语自产精品视频在线看| 欧美亚日韩国产aⅴ精品中极品| 久久夜色精品亚洲噜噜国产mv| 亚洲小少妇裸体bbw| 亚洲精品色图| 亚洲激情自拍| 免费在线国产精品| 久久久人成影片一区二区三区| 亚洲在线视频一区| 这里只有精品丝袜| 亚洲麻豆国产自偷在线| 伊人久久综合| 狠狠做深爱婷婷久久综合一区| 国产精品一区视频网站| 欧美吻胸吃奶大尺度电影| 欧美日韩国产美| 欧美日韩另类在线| 欧美日韩免费高清| 欧美日韩一区二区在线| 欧美日韩国产电影| 欧美日韩免费在线观看| 欧美日韩国产综合久久| 欧美日本在线视频| 欧美日韩国产综合新一区| 欧美精品久久久久久久免费观看 | 欧美人与禽性xxxxx杂性| 欧美www在线| 欧美成人免费在线观看| 欧美国产精品专区| 欧美日韩另类字幕中文| 国产精品ⅴa在线观看h| 国产精品久久久久久久久久久久 | 激情亚洲一区二区三区四区| 国产日韩亚洲欧美| 狠狠爱www人成狠狠爱综合网| 狠狠综合久久av一区二区老牛| 国产综合精品| 亚洲欧洲综合另类| 一区二区三区av| 亚洲欧美日韩中文视频| 久久精品视频在线| 欧美电影免费观看高清| 亚洲精品乱码久久久久久| 妖精成人www高清在线观看| 亚洲专区欧美专区| 久久久久国产精品人| 欧美成人激情在线| 欧美日韩中文精品| 国产在线乱码一区二区三区| 在线成人av网站| 亚洲图中文字幕| 久久国产一区二区三区| 欧美国产视频在线观看| 99视频一区| 久久久夜夜夜| 欧美日韩亚洲一区二区三区在线观看| 国产精品久久久久久久久| 黄色一区二区三区四区| 日韩网站在线观看| 久久精品国产一区二区三区免费看| 欧美不卡高清| 亚洲一区二区在线| 免费在线日韩av| 国产乱肥老妇国产一区二| 亚洲国语精品自产拍在线观看| 亚洲午夜视频在线| 欧美电影免费观看网站| 亚洲亚洲精品三区日韩精品在线视频 | 一二三四社区欧美黄| 久久久99精品免费观看不卡| 欧美日韩午夜在线视频| 久久xxxx| 亚洲午夜在线| 亚洲一区二区免费| 久久精品视频网| 亚洲另类自拍| 久久在线视频| 国产亚洲女人久久久久毛片| 99国产精品私拍| 美女精品在线观看| 欧美一区二区三区四区视频|