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

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>
            国产精品一卡| 中文网丁香综合网| 一区二区不卡在线视频 午夜欧美不卡在 | 在线一区欧美| 麻豆精品91| 久久综合婷婷| 国产欧美日韩一级| 亚洲视频在线播放| 99精品视频一区二区三区| 久久久久免费观看| 久久精品国产亚洲高清剧情介绍| 欧美日韩亚洲综合一区| 亚洲国产99精品国自产| 影音先锋亚洲精品| 久久成人亚洲| 久久久一区二区三区| 国产麻豆精品theporn| 一区二区三区四区精品| 宅男噜噜噜66一区二区66| 欧美电影免费观看高清| 欧美成人自拍视频| 亚洲国产精品久久久久婷婷884 | 国产亚洲人成a一在线v站| 一级日韩一区在线观看| 一区二区三区视频在线播放| 欧美激情性爽国产精品17p| 欧美国产日本高清在线| 在线播放国产一区中文字幕剧情欧美| 欧美淫片网站| 你懂的成人av| 亚洲欧美日韩国产成人| 午夜精品福利一区二区蜜股av| 欧美日韩系列| 亚洲网站在线| 久久国产手机看片| 红桃视频成人| 欧美jjzz| 9国产精品视频| 久久av一区二区三区漫画| 国产一区二区三区在线观看免费| 久久激情网站| 亚洲高清视频中文字幕| 国产精品99久久久久久久久久久久 | 久久美女性网| 亚洲欧洲视频在线| 亚洲欧美影院| 一区二区在线观看视频| 欧美国产成人在线| 亚洲一区二区精品| 久久香蕉国产线看观看网| 亚洲国产天堂久久综合网| 欧美日韩高清不卡| 欧美一级电影久久| 欧美好骚综合网| 亚洲一级黄色| 好吊色欧美一区二区三区四区| 久久男人av资源网站| 亚洲人成久久| 欧美亚洲一区三区| 亚洲国产欧美精品| 欧美视频在线观看一区| 久久精品国产一区二区电影| 亚洲精品1区| 久久久国产精品一区| 亚洲免费观看高清完整版在线观看| 国产精品爽黄69| 欧美1级日本1级| 香蕉视频成人在线观看| 亚洲激情视频网| 久久久久久自在自线| 中国av一区| 一区二区三区自拍| 国产精品久久久久久久午夜| 久久午夜羞羞影院免费观看| 亚洲视屏在线播放| 亚洲第一区色| 麻豆91精品91久久久的内涵| 浪潮色综合久久天堂| 99re这里只有精品6| 蜜桃av久久久亚洲精品| 午夜精品福利视频| 一区二区av在线| 亚洲国产另类精品专区| 国产午夜精品视频| 国产精品mv在线观看| 欧美韩国在线| 久久综合狠狠综合久久综青草| 午夜精品福利在线观看| 夜夜嗨av一区二区三区免费区 | 久久精品夜色噜噜亚洲a∨| a91a精品视频在线观看| 在线高清一区| 国内精品久久久| 国产日韩欧美综合| 国产精品久久久久一区| 欧美日韩精品免费观看视频完整| 久久婷婷国产麻豆91天堂| 欧美亚洲视频一区二区| 亚洲欧美日本日韩| 亚洲中字黄色| 亚洲资源av| 亚洲一区免费| 亚洲影院免费观看| 亚洲男人第一网站| 亚洲一区精品电影| 亚洲视频视频在线| 亚洲视频在线观看三级| 亚洲一区二区三区久久 | 亚洲乱码国产乱码精品精可以看| 亚洲成在人线av| 国产一区二区日韩| 国产欧美日韩亚州综合| 国产免费一区二区三区香蕉精| 国产精品乱码人人做人人爱| 国产精品日本欧美一区二区三区| 国产精品日韩一区| 国产午夜精品理论片a级探花 | 一区二区三区久久久| 一二美女精品欧洲| 亚洲欧美欧美一区二区三区| 亚洲影音一区| 久久久久国产一区二区| 美脚丝袜一区二区三区在线观看| 麻豆久久久9性大片| 欧美精品二区| 国产精品视频99| 狠狠久久婷婷| 亚洲精品在线观| 亚洲性图久久| 久久美女性网| 亚洲欧洲一区二区三区久久| 中文亚洲欧美| 久久久91精品国产一区二区精品| 猛干欧美女孩| 国产精品成人一区二区| 国产真实久久| 一道本一区二区| 久久久国产91| 亚洲免费观看高清在线观看 | 亚洲欧美精品suv| 久久天天躁狠狠躁夜夜av| 欧美久色视频| 国产乱码精品1区2区3区| 亚洲国产精品一区| 亚洲欧美在线x视频| 麻豆九一精品爱看视频在线观看免费| 亚洲国产专区| 欧美一区二区三区在线视频| 欧美成人日韩| 国产综合自拍| 亚洲一区二区精品| 欧美国产日韩在线| 午夜精品久久久久久久久| 欧美顶级少妇做爰| 国产一区二区在线免费观看| 亚洲免费av网站| 久久久久久久久岛国免费| 亚洲三级电影在线观看 | 亚洲尤物视频网| 欧美18av| 激情综合自拍| 校园春色综合网| 亚洲激情欧美激情| 久久久久久久综合日本| 国产精品成人一区二区| 亚洲精品欧美日韩| 久久亚洲捆绑美女| 午夜精品久久久久久99热软件 | 玖玖国产精品视频| 国产美女精品一区二区三区| 亚洲精品在线二区| 免费亚洲电影| 欧美在线黄色| 国产三区二区一区久久| 亚洲一区二区三区四区五区午夜| 免费在线一区二区| 欧美在线不卡视频| 国产麻豆精品视频| 午夜精品久久久久久久99樱桃| 亚洲巨乳在线| 欧美日韩国产精品成人| 亚洲欧洲免费视频| 欧美大片在线看| 看欧美日韩国产| 影音先锋亚洲一区| 免费亚洲电影在线| 久久综合久久综合久久| 禁久久精品乱码| 麻豆精品在线播放| 久久久夜精品| 亚洲高清视频中文字幕| 欧美不卡高清| 蜜桃av综合| 99精品国产热久久91蜜凸| 亚洲国产精品尤物yw在线观看 | 99精品国产一区二区青青牛奶| 欧美好骚综合网| 在线视频你懂得一区| 亚洲精品日本| 国产精品高潮呻吟久久av黑人|