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

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>
            久久久久久伊人| 亚洲视频一二| 久久久精品久久久久| 亚洲精品日韩久久| 国语自产在线不卡| 国产精品久久久久久久久果冻传媒| 久久精品伊人| 亚洲欧美日本另类| 99成人精品| 亚洲人成艺术| 欧美风情在线| 免费视频久久| 欧美69wwwcom| 久久综合影音| 久久综合成人精品亚洲另类欧美| 午夜精品美女久久久久av福利| 一道本一区二区| 亚洲黄色在线观看| 亚洲国产一区二区三区青草影视 | 国产精品久久99| 欧美另类专区| 欧美日本不卡| 欧美人成在线| 欧美日韩国产在线看| 欧美成人一区二区| 免费看av成人| 欧美刺激午夜性久久久久久久| 裸体歌舞表演一区二区| 久久亚洲综合色一区二区三区| 欧美在线观看视频一区二区| 先锋亚洲精品| 欧美亚洲系列| 久久久国产亚洲精品| 久久精品日产第一区二区| 久久精品噜噜噜成人av农村| 久久精视频免费在线久久完整在线看| 欧美制服丝袜第一页| 欧美专区日韩视频| 久久影院午夜论| 蜜桃久久精品乱码一区二区| 欧美大胆人体视频| 欧美日韩精品一区二区天天拍小说| 欧美日韩国产黄| 国产精品美女久久久久av超清 | 欧美日本一区二区三区| 欧美日韩在线视频首页| 国产精品视频不卡| 国产综合在线看| 亚洲第一搞黄网站| 亚洲免费播放| 亚洲欧美日韩区| 久久精品日韩一区二区三区| 久久久久久久久久久久久久一区| 免费成年人欧美视频| 欧美成人午夜影院| 亚洲精品日日夜夜| 亚洲伊人一本大道中文字幕| 欧美一区在线直播| 久热爱精品视频线路一| 欧美日韩国产在线看| 国产精品夜夜夜一区二区三区尤| 国内精品一区二区| 日韩视频在线观看一区二区| 午夜精品视频在线观看| 麻豆91精品| 亚洲美女啪啪| 欧美一级片久久久久久久| 蜜桃av一区二区三区| 国产精品久久国产精麻豆99网站| 国产亚洲一区在线播放| 日韩亚洲欧美一区| 欧美在线视频免费| 亚洲福利免费| 亚洲欧美精品suv| 欧美电影打屁股sp| 国产欧美一区二区精品秋霞影院| 亚洲激情电影中文字幕| 午夜精品福利在线| 欧美国产三级| 亚洲欧美美女| 欧美精品大片| 国产一区二区在线观看免费播放| 亚洲美女少妇无套啪啪呻吟| 欧美一区二区三区四区视频| 亚洲大黄网站| 欧美中文日韩| 国产精品护士白丝一区av| 伊大人香蕉综合8在线视| 亚洲先锋成人| 欧美激情亚洲另类| 欧美在线播放| 国产精品久久久久av| 亚洲欧洲日本国产| 久久久天天操| 亚洲一区二区欧美| 欧美日韩高清区| 亚洲高清影视| 久久免费99精品久久久久久| 日韩视频第一页| 欧美成年人网| 在线成人国产| 久久久综合免费视频| 亚洲午夜羞羞片| 欧美区国产区| 亚洲卡通欧美制服中文| 麻豆国产va免费精品高清在线| 亚洲欧美清纯在线制服| 欧美午夜无遮挡| 一本一道久久综合狠狠老精东影业| 美女黄色成人网| 欧美一区91| 国产欧美日韩一区| 欧美一级久久| 亚洲性视频h| 国产精品草草| 亚洲视频axxx| 日韩视频在线一区二区| 欧美精品网站| 99成人在线| 亚洲精选一区二区| 欧美金8天国| 99国产精品一区| 91久久久在线| 欧美啪啪成人vr| 一区二区三区精品| 亚洲精品在线视频| 欧美日韩精品福利| 亚洲视屏一区| 亚洲天堂免费观看| 国产精品区一区| 欧美在线观看网站| 香蕉久久久久久久av网站| 国产毛片精品视频| 欧美专区福利在线| 欧美在线观看网址综合| 精品1区2区3区4区| 欧美~级网站不卡| 蘑菇福利视频一区播放| 99国产精品| 一区二区三区精品在线 | 亚洲一二三区精品| 国产欧美日韩免费| 久久一区二区三区四区五区| 久久久久看片| 亚洲欧洲日韩在线| 亚洲欧洲日本专区| 国产精品vip| 久久精品国产亚洲精品| 久久久青草青青国产亚洲免观| 亚洲国产成人在线播放| 最新成人在线| 国产精品色午夜在线观看| 久久久之久亚州精品露出| 免费观看一级特黄欧美大片| 99国产精品| 香蕉久久夜色精品| 1024精品一区二区三区| 亚洲精品乱码久久久久久日本蜜臀| 欧美视频一区二区三区在线观看| 欧美伊人久久| 美女精品视频一区| 亚洲亚洲精品三区日韩精品在线视频| 亚洲免费在线看| 亚洲国产精品久久久久秋霞影院| 日韩视频免费看| 国产亚洲成精品久久| 亚洲丰满在线| 国产精品一区二区视频| 欧美国产综合| 国产精品人人做人人爽人人添| 免费视频最近日韩| 欧美网站大全在线观看| 久久一区欧美| 国产精品www.| 欧美成人在线网站| 国产精品人人做人人爽人人添| 裸体女人亚洲精品一区| 欧美午夜精品一区二区三区| 麻豆成人av| 国产精品爽黄69| 亚洲电影在线看| 国产亚洲成av人在线观看导航 | 国产精品免费电影| 亚洲二区视频在线| 国产一级揄自揄精品视频| 亚洲精品欧美极品| 精东粉嫩av免费一区二区三区| aa级大片欧美三级| 亚洲国产精品成人| 性欧美videos另类喷潮| 一个色综合导航| 老色鬼精品视频在线观看播放| 亚久久调教视频| 欧美片网站免费| 欧美激情免费在线| 黑人一区二区| 午夜激情亚洲| 亚洲欧美美女| 欧美揉bbbbb揉bbbbb| 亚洲国产精品久久久久婷婷884|