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

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在线精品免费视频九九视| 亚洲香蕉网站| 在线精品视频一区二区三四| 亚洲欧洲偷拍精品| 国产女主播视频一区二区| 你懂的视频欧美| 欧美日韩亚洲天堂| 久久一区视频| 欧美三级网页| 久久久91精品国产| 欧美日韩成人综合在线一区二区 | 久久综合电影| 一个色综合导航| 久久国产精品毛片| 一区二区激情| 久久免费视频在线观看| 亚洲一区免费视频| 玖玖玖国产精品| 亚洲欧美清纯在线制服| 免费中文日韩| 久久精品国产亚洲一区二区三区 | 一区电影在线观看| 激情综合视频| 亚洲一区二区三区久久| 日韩视频免费观看高清在线视频 | 一区二区三区 在线观看视频| 一区二区视频免费在线观看| 一区二区三区高清在线 | 欧美日产一区二区三区在线观看 | 久久夜色精品国产欧美乱极品| 欧美高清免费| 美女网站在线免费欧美精品| 欧美日韩播放| 亚洲国产欧美另类丝袜| 在线高清一区| 欧美一区二区三区喷汁尤物| 亚洲小视频在线观看| 欧美丰满少妇xxxbbb| 蜜臀av性久久久久蜜臀aⅴ四虎| 国产精品视频区| 99re热这里只有精品视频| 亚洲人www| 欧美jizz19hd性欧美| 免费久久精品视频| 狠狠色综合色区| 久久精品72免费观看| 久久精品一区二区三区中文字幕| 国产精品国产三级国产专播品爱网 | 午夜欧美精品| 国产精品一区二区久久久| 亚洲视频一二区| 亚洲欧美综合网| 国产久一道中文一区| 亚洲一区二区在线免费观看| 亚洲欧美三级在线| 国产精品一二三视频| 午夜亚洲激情| 久久久激情视频| 一区二区三区在线看| 久久久久久亚洲精品杨幂换脸| 久久久久久婷| 亚洲丶国产丶欧美一区二区三区| 久久久夜色精品亚洲| 亚洲第一在线视频| 夜夜嗨网站十八久久| 欧美小视频在线| 亚洲欧美国产精品桃花| 久久久久久**毛片大全| 亚洲激情第一页| 欧美日韩成人精品| 亚洲一区免费观看| 麻豆精品视频在线| 日韩天堂av| 国产精品实拍| 久久久国产精品一区| 亚洲国产日韩欧美一区二区三区| 99爱精品视频| 国产欧美精品在线播放| 久久精品一本久久99精品| 欧美激情精品久久久久久久变态 | 国产区日韩欧美| 老鸭窝91久久精品色噜噜导演| 亚洲激情欧美激情| 亚洲欧美日韩中文视频| 激情校园亚洲| 欧美日韩三级| 久久米奇亚洲| 中文精品一区二区三区| 久久一区二区三区四区| 中文亚洲免费| 在线看国产一区| 国产精品区一区| 欧美成人国产一区二区| 亚洲免费影视| 亚洲狠狠丁香婷婷综合久久久| 亚洲免费在线电影| 亚洲精品国产精品国自产观看| 国产免费成人在线视频| 欧美日韩18| 老牛影视一区二区三区| 亚洲一区自拍| 亚洲精品视频啊美女在线直播| 久久漫画官网| 香港成人在线视频| 99热免费精品| 亚洲高清视频的网址| 国产日韩欧美中文在线播放| 欧美视频免费在线| 欧美高清视频在线观看| 久久婷婷丁香| 欧美一区二区三区在线看| 亚洲视频综合| 一本到12不卡视频在线dvd| 亚洲第一搞黄网站| 久久视频一区| 久久精品国产久精国产一老狼 | 艳女tv在线观看国产一区| 国内久久视频| 国产亚洲毛片在线| 国产精品综合网站| 国产精品高潮久久| 欧美涩涩视频| 欧美日韩在线视频一区| 欧美日韩精品在线视频| 欧美日韩第一页| 欧美日韩国产在线一区| 欧美日本在线| 欧美日本在线视频| 欧美日韩一区二区三| 欧美剧在线免费观看网站| 欧美日韩国产综合久久| 欧美日韩亚洲高清| 欧美日韩综合另类| 国产精品少妇自拍| 国产欧美精品日韩区二区麻豆天美| 国产精品无码专区在线观看| 国产精品视频| 国产日韩欧美视频在线| 国模叶桐国产精品一区| 极品中文字幕一区| 亚洲欧洲日本国产| 一区二区三区精品久久久| 亚洲永久精品大片| 老司机午夜精品视频在线观看| 欧美在线亚洲在线| 久久免费一区| 欧美国产日本在线| 国产精品劲爆视频| 国产情侣一区| 亚洲国产毛片完整版| 亚洲视频电影在线| 欧美一级在线播放| 美腿丝袜亚洲色图| 亚洲清纯自拍| 亚洲一区二区视频| 久久米奇亚洲| 国产精品r级在线| 狠狠入ady亚洲精品| 亚洲人成高清| 欧美一区二粉嫩精品国产一线天| 久久蜜臀精品av| 亚洲精品乱码久久久久久日本蜜臀 | 一区二区三区在线高清| 一本色道久久| 久久三级福利| 亚洲精品一品区二品区三品区| 亚洲在线播放| 欧美激情一二区| 国产日韩av一区二区| 91久久精品一区二区别| 欧美一区成人| 亚洲精品美女在线| 久久国产主播精品| 国产精品二区在线观看| 在线精品视频免费观看| 午夜宅男久久久| 亚洲三级免费| 久久只精品国产| 国产午夜精品久久| 亚洲一区在线播放| 亚洲国产欧美在线人成|