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

eryar

PipeCAD - Plant Piping Design Software.
RvmTranslator - Translate AVEVA RVM to OBJ, glTF, etc.
posts - 603, comments - 590, trackbacks - 0, articles - 0

Bounding Volume Hierarchy BVH in OpenCASCADE

Posted on 2017-05-03 22:50 eryar 閱讀(6452) 評(píng)論(0)  編輯 收藏 引用 所屬分類(lèi): 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)是一種基于物體的場(chǎng)景管理技術(shù),廣泛用于碰撞檢測(cè),光線(xiàn)追蹤,視錐體物體剔除等場(chǎng)合。對(duì)于三維場(chǎng)景的實(shí)時(shí)渲染來(lái)說(shuō),BVH是最常用的數(shù)據(jù)結(jié)構(gòu)。場(chǎng)景以層次樹(shù)形結(jié)構(gòu)進(jìn)行組織,包含一個(gè)根節(jié)點(diǎn)、內(nèi)部節(jié)點(diǎn)、葉子節(jié)點(diǎn)。樹(shù)中的每個(gè)節(jié)點(diǎn),包括葉子節(jié)點(diǎn)都有一個(gè)包圍體,可以將其子樹(shù)的所有幾何體包圍起來(lái),這就是BVH名字的由來(lái)。如下圖所示:

wps9752.tmp

Figure 1. Simple Scene(left), BVH Scene Graph(right)

本文主要介紹OpenCASCADE中的BVH包及其應(yīng)用,如碰撞檢測(cè)。

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)策略來(lái)構(gòu)造BVH樹(shù)的。根據(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)造方法,如類(lèi)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

由類(lèi)BVH_TreeBase可知,當(dāng)?shù)玫紹VH樹(shù)后,可以取出節(jié)點(diǎn)索引的數(shù)組。下面給出將TopoDS_Shape的BVH樹(shù)顯示出來(lái)的示例代碼:

/*
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é)點(diǎn)信息

const BVH_Vec4i& aNodeData = aBvh->NodeInfoBuffer()[i];

后,通過(guò)判斷aNodeData.x()分量來(lái)確定此節(jié)點(diǎn)是內(nèi)部節(jié)點(diǎn)還是葉子節(jié)點(diǎn)。顯示OCC自帶的螺旋槳模型的BVH如下圖所示:

wps9772.tmp

wps9773.tmp

其中紅色線(xiàn)框?yàn)閮?nèi)部節(jié)點(diǎn),黃色實(shí)體模型是葉子節(jié)點(diǎn)。

wps9774.tmp

wps9775.tmp

4.BVH Application

BVH在OpenCASCADE中也有廣泛地應(yīng)用,如開(kāi)源版本中的模型快速碰撞檢測(cè),使用類(lèi)BRepExtrema_ShapeProximity. 模型選擇操作,光線(xiàn)跟蹤等算法中都有應(yīng)用。

5.Conclusion

因?yàn)镺penCASCADE中構(gòu)造BVH時(shí)依賴(lài)模型的網(wǎng)格三角形,所以BVH算法的應(yīng)用的結(jié)果就依賴(lài)于網(wǎng)格化算法的質(zhì)量了。如兩個(gè)Topo形狀碰撞檢測(cè)時(shí),網(wǎng)格化的質(zhì)量越高,結(jié)果精度越高。如果用解析算法去對(duì)兩個(gè)Topo形狀做碰撞檢測(cè),也會(huì)涉及到解析算法的精度問(wèn)題。

BVH結(jié)構(gòu)廣泛應(yīng)用于碰撞檢測(cè)、光線(xiàn)跟蹤等算法中,大大提高程序性能。本文只是拋磚引玉,對(duì)BVH感興趣的童鞋可以參考相關(guān)資料及OpenCASCADE中的代碼實(shí)現(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游戲引擎中常見(jiàn)的三維場(chǎng)景管理方法. 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>
            久久一区国产| 国产精品美女www爽爽爽| 欧美va亚洲va日韩∨a综合色| 亚洲制服av| 性做久久久久久久久| 欧美亚洲一区二区三区| 欧美在线日韩精品| 国产麻豆日韩| 国产精品亚洲综合久久| 韩国女主播一区| 亚洲国产婷婷香蕉久久久久久99| 在线视频成人| 亚洲午夜电影网| 久久久91精品国产一区二区三区| 久久亚洲风情| 亚洲精选久久| 欧美一级免费视频| 免费人成精品欧美精品| 欧美视频官网| 亚洲高清在线精品| 午夜精品久久久久99热蜜桃导演| 久久久久久欧美| 亚洲精品中文字幕女同| 亚洲欧美日韩专区| 欧美大片免费| 国内揄拍国内精品久久| 正在播放日韩| 欧美成人国产一区二区| 亚洲一区二区综合| 欧美大片免费观看在线观看网站推荐| 国产精品手机视频| 亚洲视频精品在线| 欧美激情一区二区| 久久国产精品99精品国产| 欧美日韩亚洲综合一区| 在线看片成人| 久久久久国产一区二区三区| 亚洲美女视频| 欧美精品成人| 亚洲精品免费电影| 欧美电影免费观看高清| 久久精品123| 国产亚洲高清视频| 午夜精品网站| 亚洲最新视频在线| 欧美日韩日本国产亚洲在线| 最新亚洲电影| 欧美国产一区视频在线观看| 欧美在线亚洲| 国产自产精品| 久久久91精品| 久久女同精品一区二区| 伊人成人开心激情综合网| 久久久久看片| 性欧美在线看片a免费观看| 国产精品久久久久影院色老大| 亚洲美女色禁图| 亚洲国产精品久久久久秋霞不卡| 一区二区三区精品久久久| 欧美日韩日本国产亚洲在线 | 国产自产女人91一区在线观看| 中文在线一区| 一本色道久久88亚洲综合88| 欧美日韩视频免费播放| 一区二区三区日韩在线观看| 亚洲一区二区精品在线| 亚洲欧洲日产国产网站| 欧美激情1区| 在线视频你懂得一区| 亚洲日韩视频| 国产精品xnxxcom| 欧美一级成年大片在线观看| 亚洲嫩草精品久久| 国语自产精品视频在线看抢先版结局| 久久久亚洲午夜电影| 久久国产一二区| 亚洲国产va精品久久久不卡综合| 欧美激情精品久久久久久黑人| 欧美 日韩 国产在线| 一本大道久久a久久综合婷婷| 一本色道精品久久一区二区三区 | 久久青青草综合| 亚洲福利视频在线| 日韩午夜av在线| 国产夜色精品一区二区av| 欧美成人国产| 国产精品二区在线| 久久天天狠狠| 欧美理论视频| 久久久久久久一区二区三区| 欧美mv日韩mv国产网站| 亚洲一二三区在线| 久久国产欧美精品| 999亚洲国产精| 西西裸体人体做爰大胆久久久| 在线播放日韩专区| 亚洲无玛一区| 亚洲黄一区二区三区| 亚洲小说欧美另类社区| 亚洲国产成人久久综合一区| 一区二区三区国产| 亚洲高清资源综合久久精品| 日韩一本二本av| 亚洲第一福利视频| 亚洲欧美日韩久久精品| 亚洲精品女av网站| 午夜精品成人在线| 亚洲特级片在线| 欧美成人精品在线观看| 久久中文在线| 国产精品久久| 亚洲激情电影在线| 禁断一区二区三区在线| 亚洲社区在线观看| 日韩午夜精品| 欧美成黄导航| 欧美电影免费观看高清完整版| 国产免费一区二区三区香蕉精| 日韩午夜av| 一道本一区二区| 欧美美女视频| 最新成人av在线| 亚洲精品乱码久久久久| 免费不卡中文字幕视频| 久久综合九色| 国内视频一区| 欧美在线一二三区| 久久精品国产亚洲一区二区三区| 欧美性色aⅴ视频一区日韩精品| 亚洲第一综合天堂另类专| 欧美一区二区视频在线观看2020| 亚洲欧美一区二区原创| 欧美视频不卡| 99在线精品视频在线观看| 日韩性生活视频| 欧美—级高清免费播放| 欧美激情一区二区| 亚洲三级毛片| 欧美麻豆久久久久久中文| 亚洲精品网址在线观看| 99国产精品99久久久久久| 欧美日韩 国产精品| 亚洲精品一区二区三区蜜桃久| 亚洲精品国产精品国自产观看| 欧美va亚洲va国产综合| 91久久国产精品91久久性色| 日韩午夜精品| 国产精品美女久久福利网站| 亚洲伊人网站| 久久亚洲一区二区| 最新国产成人在线观看| 欧美日韩国产二区| 亚洲性感美女99在线| 久久精品动漫| 亚洲激情在线| 欧美日韩在线亚洲一区蜜芽| 亚洲五月六月| 麻豆freexxxx性91精品| 91久久精品美女高潮| 欧美交受高潮1| 亚洲视频电影在线| 久久综合图片| 亚洲色图自拍| 国产一区二区在线免费观看| 久久综合影音| 一级日韩一区在线观看| 久久免费视频在线| 亚洲精品永久免费精品| 国产精品久久久久一区二区| 久久久之久亚州精品露出| 亚洲精品一区二区三| 久久久成人精品| 亚洲视频精品在线| 樱桃成人精品视频在线播放| 欧美女同视频| 久久久91精品| 亚洲无线视频| 亚洲国产欧美一区| 久久精品主播| 亚洲一区二区黄色| 亚洲国产成人精品久久| 国产精品一卡| 欧美日韩国产精品一区| 久久久人人人| 亚洲欧美日韩一区二区| 亚洲日韩中文字幕在线播放| 久久久久久自在自线| 亚洲一区二区黄色| 亚洲精品之草原avav久久| 国产主播精品在线| 欧美性色aⅴ视频一区日韩精品| 久久综合激情| 香蕉乱码成人久久天堂爱免费| 亚洲美洲欧洲综合国产一区| 久久综合色综合88| 久久激情五月丁香伊人| 午夜国产精品视频| 亚洲图片自拍偷拍| 一本色道久久综合精品竹菊 | 亚洲精品视频二区|