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

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>
            亚洲国产精品一区二区第一页 | 欧美一区二区三区视频免费| 激情综合视频| 亚洲先锋成人| 日韩视频免费观看高清在线视频 | 亚洲第一精品影视| 国产精品稀缺呦系列在线| 亚洲精品久久久久久下一站| 1000精品久久久久久久久 | 亚洲天堂成人在线观看| 亚洲精品在线看| 麻豆国产精品va在线观看不卡| 欧美在线一级va免费观看| 国产精品国产精品国产专区不蜜| 欧美激情精品久久久久久免费印度| 国产亚洲精品久久久久婷婷瑜伽| 在线一区二区日韩| 亚洲永久精品大片| 国产精品www994| 亚洲一区二区少妇| 亚洲欧美制服中文字幕| 国产精品第十页| 一区二区三区视频观看| 亚洲欧美激情一区二区| 国产精品久久中文| 亚洲无限av看| 久久精品卡一| 精品69视频一区二区三区 | 午夜精品久久久久久久99黑人| 亚洲一区二区3| 国产精品劲爆视频| 亚洲一区二区三区四区视频 | 亚洲精品女av网站| 猛男gaygay欧美视频| 麻豆精品视频| 最新中文字幕一区二区三区| 欧美h视频在线| 亚洲精品国偷自产在线99热| 亚洲视频综合在线| 国产女人精品视频| 久久久精品免费视频| 免费在线国产精品| 亚洲免费观看在线观看| 欧美视频在线观看| 午夜日韩福利| 亚洲高清一区二| 亚洲夜间福利| 激情成人av| 欧美mv日韩mv国产网站| 99riav久久精品riav| 欧美在线1区| 亚洲国产欧美一区| 国产精品久久国产精品99gif| 午夜视频在线观看一区二区三区| 能在线观看的日韩av| 中文在线不卡| 狠狠入ady亚洲精品经典电影| 欧美大片91| 中文网丁香综合网| 欧美r片在线| 亚洲综合丁香| 亚洲电影下载| 国产精品欧美日韩一区| 久久视频在线免费观看| 夜夜爽av福利精品导航 | 欧美bbbxxxxx| 午夜精品久久一牛影视| 亚洲人成在线播放网站岛国| 欧美亚洲色图校园春色| 亚洲精品中文字幕有码专区| 国产亚洲福利社区一区| 欧美日韩不卡| 久久男女视频| 性色av一区二区三区红粉影视| 欧美黄色网络| 久久一区精品| 亚洲天堂av综合网| 亚洲精品一级| 国产免费一区二区三区香蕉精| 欧美成人69av| 久久久高清一区二区三区| 亚洲专区国产精品| 亚洲国内在线| 欧美福利专区| 久久精品99国产精品| 亚洲一区日韩| 一区二区三区日韩欧美精品| 亚洲国产精品成人综合| 国内精品99| 国产视频亚洲| 国产精品普通话对白| 欧美日韩成人在线视频| 欧美不卡视频一区发布| 久久不射中文字幕| 欧美主播一区二区三区美女 久久精品人| 99国产精品国产精品毛片| 亚洲人成在线观看网站高清| 欧美大片免费久久精品三p| 久久久久久久久久久久久女国产乱 | 国产精品手机视频| 国产精品99一区二区| 欧美日韩亚洲一区二区三区在线| 欧美大片免费| 欧美福利视频在线| 欧美激情亚洲国产| 欧美国产欧美综合| 欧美第十八页| 欧美美女喷水视频| 欧美日本精品| 欧美日韩在线亚洲一区蜜芽| 欧美精品一区二区三区蜜桃| 欧美日韩国产不卡| 国产精品99一区二区| 欧美午夜精品久久久久久久 | 亚洲国产精彩中文乱码av在线播放 | 国产精品高潮呻吟久久| 欧美午夜久久| 国产精品一级在线| 国产综合久久久久影院| 激情久久五月| 亚洲日本精品国产第一区| 一级成人国产| 亚洲欧美日韩国产综合| 欧美在线资源| 老妇喷水一区二区三区| 亚洲电影视频在线| 亚洲最新在线| 欧美亚洲在线| 欧美成人激情在线| 国产精品久久久久秋霞鲁丝| 国产亚洲午夜高清国产拍精品| 在线日韩av片| 亚洲视频在线播放| 久久精品国产综合精品| 欧美大片91| 亚洲午夜精品福利| 久久狠狠亚洲综合| 欧美国内亚洲| 国产欧美一区二区三区视频| 一区二区视频免费完整版观看| 亚洲精品在线电影| 久久爱www久久做| 亚洲激情校园春色| 午夜精品www| 欧美激情导航| 国产在线拍揄自揄视频不卡99 | 亚洲视频观看| 久久久亚洲国产天美传媒修理工| 亚洲福利视频三区| 亚洲在线免费观看| 欧美国产日韩亚洲一区| 国产欧美成人| 亚洲午夜激情在线| 欧美国产日韩二区| 亚洲欧美综合v| 欧美日韩一区在线视频| 韩国视频理论视频久久| 亚洲无人区一区| 欧美大片一区二区三区| 亚洲欧美日韩国产一区二区三区| 蜜臀av一级做a爰片久久| 国产精品视频一二| 99国产麻豆精品| 欧美大片91| 久久精品国产精品| 国产欧美日韩三区| 亚洲一级在线观看| 91久久精品美女| 久久久亚洲高清| 国产九区一区在线| 亚洲网站在线观看| 亚洲日本免费| 欧美成在线视频| 在线播放一区| 久久综合国产精品| 欧美一区永久视频免费观看| 国产精品jizz在线观看美国| 99在线精品观看| 亚洲精品免费电影| 男女激情视频一区| 亚洲电影在线观看| 卡一卡二国产精品| 久久久久久69| 激情欧美一区二区三区| 久久精品国产亚洲aⅴ| 亚洲尤物视频在线| 国产精品久久久久久久久久三级| 在线视频亚洲| 一本一本久久a久久精品综合妖精| 欧美国产精品劲爆| 99国产一区二区三精品乱码| 亚洲精品国产系列| 欧美日韩一区二区在线观看| 亚洲乱码视频| 99精品免费| 国产欧美日韩激情| 久久久久九九视频| 久久精品国产亚洲一区二区| 激情成人亚洲| 亚洲高清一区二区三区|