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

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>
            一本大道久久a久久综合婷婷| 欧美精品成人在线| 国产精品美女久久久浪潮软件| 欧美激情bt| 久久精品视频免费| 久久久久国内| 欧美激情综合| 亚洲精品一区二区三区不| 免费黄网站欧美| 欧美18av| 99视频有精品| 日韩午夜中文字幕| 国产欧美一级| 欧美凹凸一区二区三区视频| 久久综合影视| 一本色道久久综合亚洲精品高清 | 国产精品a级| 久久久久国产免费免费| 久久久国产精品一区二区三区| 韩日欧美一区| 亚洲国产精品久久久久婷婷884| 久久免费国产精品1| 亚洲精品网站在线播放gif| 艳妇臀荡乳欲伦亚洲一区| 国产欧美一区二区精品婷婷| 欧美国产日韩一区二区| 国产精品av久久久久久麻豆网| 久久久久久久成人| 欧美成年网站| 欧美中文在线视频| 亚洲欧美日韩国产成人| 久久精品麻豆| 伊人婷婷欧美激情| 欧美高清影院| 欧美区二区三区| 一本久道久久久| 亚洲小说欧美另类社区| 国产精品久久久久久久久久免费 | 91久久夜色精品国产九色| 999在线观看精品免费不卡网站| 久久久久久综合网天天| 国产一本一道久久香蕉| 午夜精品久久久久久久久久久久久| 亚洲精品视频在线看| 久久精品国产亚洲高清剧情介绍| 国产精品区一区| 午夜免费久久久久| 亚洲免费在线视频| 国产精品中文字幕欧美| 欧美一区网站| 午夜精品久久| 亚洲一区视频在线| 午夜在线a亚洲v天堂网2018| 亚洲国产女人aaa毛片在线| 亚洲裸体在线观看| 国产欧美日韩专区发布| 欧美丰满少妇xxxbbb| 欧美日韩日本网| 久久精品国产一区二区三区| 免费欧美日韩| 亚久久调教视频| 亚洲在线视频一区| 欧美特黄a级高清免费大片a级| 国产一区香蕉久久| 亚洲欧美日韩精品久久久| 亚洲女人小视频在线观看| 欧美视频1区| 久久免费视频网站| 欧美午夜精品久久久久久孕妇| 免费成人黄色av| 国产精品s色| 亚洲欧洲精品天堂一级| 国产九九视频一区二区三区| 亚洲娇小video精品| 精品69视频一区二区三区| 亚洲香蕉视频| 9l视频自拍蝌蚪9l视频成人| 久久精品国产精品亚洲| 亚洲一级影院| 久久免费精品视频| 久久国产视频网| 欧美手机在线视频| 亚洲欧洲另类| 91久久精品国产91久久性色tv| 亚洲欧美日韩区| 欧美一区二区三区四区视频| 欧美日韩一区二区三区| 亚洲第一精品夜夜躁人人爽| 亚洲大胆人体在线| 玖玖精品视频| 亚洲一区三区视频在线观看 | 亚洲国产另类精品专区| 午夜精品一区二区三区在线播放| 国产欧美视频一区二区| 亚洲高清三级视频| 激情久久久久久久| 欧美一区三区三区高中清蜜桃| 亚洲欧美激情在线视频| 欧美偷拍一区二区| 一本久久精品一区二区| 亚洲综合三区| 国产精品久久久久毛片大屁完整版 | 亚洲综合三区| 国产精品裸体一区二区三区| 日韩午夜高潮| 亚洲一区二区三区乱码aⅴ| 欧美日产国产成人免费图片| 日韩一区二区久久| 午夜精品久久久久影视| 国产精品日日摸夜夜添夜夜av| 亚洲欧美另类国产| 久久久久久黄| 亚洲福利国产| 欧美日韩国产色综合一二三四| 欧美成人高清| 欧美日韩国产综合视频在线观看| 欧美成人影音| 国产农村妇女精品| 亚洲欧美国产精品桃花| 午夜精品电影| 国产精品视频专区| 亚欧成人精品| 欧美成人精品激情在线观看| 91久久综合| 欧美日韩成人一区二区三区| 一本到高清视频免费精品| 欧美在线视频免费观看| 亚洲丰满少妇videoshd| 欧美日韩一区不卡| 久久成人免费| 99视频超级精品| 欧美永久精品| 亚洲国产视频一区二区| 国产精品白丝av嫩草影院| 久久噜噜噜精品国产亚洲综合| 亚洲精品国产欧美| 欧美一区在线看| 91久久午夜| 国产专区欧美专区| 欧美精品久久久久久久久老牛影院 | 欧美专区18| 欧美日韩123| 另类成人小视频在线| 亚洲大片免费看| 欧美色中文字幕| 久久国产直播| 9国产精品视频| 欧美一区二区成人6969| 国产精品色婷婷| 免费欧美在线| 久久久久久久一区二区三区| 99精品视频免费观看视频| 欧美福利电影在线观看| 久久久久久自在自线| 夜夜爽www精品| 亚洲国产精品999| 国产一区二区日韩精品欧美精品| 欧美精品在线免费播放| 久久夜色精品| 久久久久久伊人| 亚洲欧美日韩国产一区| 一本色道88久久加勒比精品 | 在线观看视频欧美| 国产精品一区二区三区免费观看 | 亚洲影院免费观看| 亚洲激情网站| 欧美电影免费| 免费在线成人av| 久久久久久一区二区| 久久国产福利国产秒拍| 午夜在线成人av| 亚洲欧美日韩一区二区| 亚洲一级黄色| 亚洲午夜精品国产| 国产老肥熟一区二区三区| 欧美国产日产韩国视频| 亚洲人成网站色ww在线| 国产精品v欧美精品∨日韩| 欧美日韩123| 亚洲欧美综合| 亚洲第一毛片| 亚洲乱码国产乱码精品精可以看| 亚洲国产高清在线| 最新亚洲激情| 亚洲美女视频| 亚洲女优在线| 久久国产视频网| 久久精品国产久精国产爱| 久久不射网站| 老司机免费视频久久| 蜜臀91精品一区二区三区| 亚洲国产日韩在线| 99精品国产热久久91蜜凸| 亚洲视频电影图片偷拍一区| 午夜精品久久| 久久大香伊蕉在人线观看热2| 亚洲特黄一级片| 亚洲美女福利视频网站| 亚洲一区二区三区精品在线| 久久精品一区蜜桃臀影院|