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

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| 国产亚洲欧美日韩一区二区| 欧美一区二区私人影院日本 | 久久米奇亚洲| 欧美成人精品不卡视频在线观看| 亚洲电影专区| 欧美另类久久久品| 一本色道久久综合精品竹菊| 先锋影音一区二区三区| 国产日韩欧美不卡| 久久亚洲色图| 日韩网站免费观看| 亚洲欧美综合另类中字| 国内精品久久久久影院优| 久久亚洲精品一区| 亚洲精品少妇| 欧美专区在线观看| 亚洲国产第一| 国产精品v日韩精品| 性欧美18~19sex高清播放| 欧美ab在线视频| 一区二区激情视频| 国产精品一区二区三区久久久| 久久av最新网址| 91久久在线观看| 欧美亚洲综合久久| 亚洲福利视频一区二区| 欧美日韩在线视频首页| 久久不见久久见免费视频1| 亚洲国产精品美女| 性欧美8khd高清极品| 亚洲高清免费| 国产精品日韩欧美一区| 久久久xxx| 中文一区在线| 欧美福利视频一区| 欧美亚洲一区二区三区| 亚洲精品一区二区三区在线观看| 国产精品国产福利国产秒拍| 久久久久**毛片大全| 一本久久青青| 亚洲国产成人porn| 欧美一区二区三区啪啪| 一本色道久久综合亚洲精品小说 | 99精品免费视频| 国内精品国产成人| 欧美手机在线| 欧美国产大片| 久久久综合网站| 午夜日韩激情| 亚洲午夜电影| 亚洲美女淫视频| 欧美国产日韩一区二区| 久久精品视频在线播放| 亚洲综合视频网| 99热在这里有精品免费| 亚洲成人在线免费| 国产综合色精品一区二区三区| 国产精品ⅴa在线观看h| 欧美激情综合在线| 美女精品国产| 久久久亚洲精品一区二区三区| 午夜精彩国产免费不卡不顿大片| 亚洲麻豆一区| 亚洲日本一区二区三区| 欧美激情视频在线免费观看 欧美视频免费一 | 男女av一区三区二区色多| 欧美在线看片| 亚洲欧美中文日韩在线| 亚洲香蕉视频| 亚洲一级黄色| 亚洲欧美第一页| 亚洲永久免费| 午夜精品久久久久久久99水蜜桃 | 久久国产主播精品| 亚洲欧美视频一区二区三区| 亚洲素人在线| 亚洲在线中文字幕| 亚洲在线观看免费视频| 亚洲在线网站| 亚洲自拍偷拍色片视频| 亚洲欧美中文在线视频| 欧美亚洲免费高清在线观看| 欧美在线视频免费播放| 欧美一区二区三区四区在线 | 欧美日韩精品三区| 欧美日韩国产精品专区| 欧美日韩一级黄| 国产精品成人一区二区三区夜夜夜| 欧美亚日韩国产aⅴ精品中极品| 欧美三区不卡| 国产酒店精品激情| 国内综合精品午夜久久资源| 永久域名在线精品| 亚洲激情成人在线| 亚洲一区自拍| 久久精品人人做人人综合 | 久久香蕉国产线看观看网| 免费观看成人| 欧美日本中文字幕| 国产精品毛片va一区二区三区 | 在线亚洲观看| 欧美一区二区在线播放| 久久亚洲私人国产精品va| 欧美激情在线免费观看| 一本大道久久a久久精二百| 亚洲欧美中文日韩v在线观看| 久久久久久久性| 欧美日韩午夜| 国产色产综合产在线视频| 1024欧美极品| 一区二区三区日韩欧美| 欧美一区二区高清| 欧美黑人一区二区三区| av成人黄色| 久久久国产精品亚洲一区| 欧美激情精品| 国产日韩欧美在线一区| 亚洲精品中文字幕有码专区| 欧美亚洲日本网站| 欧美激情一区二区三区在线视频观看 | 亚洲综合色视频| 欧美91精品| 国产色视频一区| 在线亚洲精品| 蜜桃av噜噜一区二区三区| 夜夜嗨av色综合久久久综合网| 久久九九精品| 国产精品乱子久久久久| 亚洲综合999| 欧美精品首页| 影音先锋亚洲一区| 香港久久久电影| 亚洲九九九在线观看| 久久久精彩视频| 国产精品区一区二区三区| 亚洲精品国产系列| 久久免费视频网站| 午夜精品久久久久久久蜜桃app| 欧美久久久久| 尤物yw午夜国产精品视频明星| 午夜精品国产精品大乳美女| 91久久精品www人人做人人爽 | 亚洲在线播放| 欧美另类女人| 亚洲精品国产精品国自产在线 | 欧美日韩成人一区二区三区| 亚洲高清av在线| 久久天天综合| 欧美一区二区三区四区在线| 国产精品国产三级国产普通话99| 亚洲精品视频在线播放| 麻豆精品在线观看| 久久激情综合| 国产一区二区三区四区在线观看 | 在线视频欧美精品| 欧美激情一区二区三区不卡| 亚洲第一狼人社区| 媚黑女一区二区| 久久精品亚洲精品国产欧美kt∨| 国产日韩欧美成人| 欧美一区二区在线看| 亚洲免费网站| 国产性天天综合网| 久久精品导航| 欧美一区激情| 国产亚洲欧美一区在线观看| 久久久成人精品| 久久久久久久久久久久久久一区| 精品成人乱色一区二区| 欧美成人精品h版在线观看| 模特精品在线| aa日韩免费精品视频一|