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

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) 評論(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)是一種基于物體的場景管理技術,廣泛用于碰撞檢測,光線追蹤,視錐體物體剔除等場合。對于三維場景的實時渲染來說,BVH是最常用的數據結構。場景以層次樹形結構進行組織,包含一個根節點、內部節點、葉子節點。樹中的每個節點,包括葉子節點都有一個包圍體,可以將其子樹的所有幾何體包圍起來,這就是BVH名字的由來。如下圖所示:

wps9752.tmp

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

本文主要介紹OpenCASCADE中的BVH包及其應用,如碰撞檢測。

2.Build BVH

在BVH包中的頭文件里面找到BVH的作者:Denis BOGOLEPOV, Danila ULYANOV,在網上搜到他們的一篇論文:Real-Time SAH BVH Construction for Ray Tracing Dynamic Scenes. 因此,可知BVH中是應用SAH(Surface Area Heuristic)策略來構造BVH樹的。根據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中也提供了其他的構造方法,如類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可知,當得到BVH樹后,可以取出節點索引的數組。下面給出將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;
}

由上述代碼可知,當得到節點信息

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

后,通過判斷aNodeData.x()分量來確定此節點是內部節點還是葉子節點。顯示OCC自帶的螺旋槳模型的BVH如下圖所示:

wps9772.tmp

wps9773.tmp

其中紅色線框為內部節點,黃色實體模型是葉子節點。

wps9774.tmp

wps9775.tmp

4.BVH Application

BVH在OpenCASCADE中也有廣泛地應用,如開源版本中的模型快速碰撞檢測,使用類BRepExtrema_ShapeProximity. 模型選擇操作,光線跟蹤等算法中都有應用。

5.Conclusion

因為OpenCASCADE中構造BVH時依賴模型的網格三角形,所以BVH算法的應用的結果就依賴于網格化算法的質量了。如兩個Topo形狀碰撞檢測時,網格化的質量越高,結果精度越高。如果用解析算法去對兩個Topo形狀做碰撞檢測,也會涉及到解析算法的精度問題。

BVH結構廣泛應用于碰撞檢測、光線跟蹤等算法中,大大提高程序性能。本文只是拋磚引玉,對BVH感興趣的童鞋可以參考相關資料及OpenCASCADE中的代碼實現,去深入學習應用。

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精品视频一区| 亚洲青涩在线| 亚洲人成人一区二区三区| 欧美成人自拍视频| 免费观看在线综合色| 欧美在线观看www| 欧美伊人久久大香线蕉综合69| 最近看过的日韩成人| 一区二区三区在线看| 99国内精品| 午夜精品国产精品大乳美女| 欧美一级在线亚洲天堂| 欧美在线视频免费播放| 久久综合99re88久久爱| 欧美激情一二三区| 伊人久久大香线蕉av超碰演员| 精品成人国产| 午夜老司机精品| 久久精品国产一区二区三区免费看| 欧美一区二区三区四区视频| 久久三级福利| 亚洲午夜视频| 免费高清在线一区| 国产精品国产三级国产aⅴ无密码 国产精品国产三级国产aⅴ入口 | 一区二区三区欧美亚洲| 亚洲免费视频一区二区| 久久爱91午夜羞羞| 老司机久久99久久精品播放免费 | 欧美人与禽性xxxxx杂性| 欧美性猛片xxxx免费看久爱| 国产一区清纯| 欧美中文字幕在线播放| 亚洲乱码一区二区| 欧美14一18处毛片| 红桃视频一区| 久久精品一区蜜桃臀影院| 欧美激情第一页xxx| 欧美中文字幕精品| 国产精品美女视频网站| 欧美成人精品高清在线播放| 欧美风情在线| 亚洲影院免费| 性色一区二区| 亚洲黄色视屏| 日韩视频在线免费观看| 国产精品久久久久久超碰| 一本色道久久综合亚洲精品不 | 久久―日本道色综合久久| 亚洲午夜电影| 韩国av一区二区三区| 久久嫩草精品久久久久| 久久精品女人天堂| 激情视频一区| 91久久极品少妇xxxxⅹ软件| 麻豆精品一区二区综合av| 国产视频不卡| 亚洲精品你懂的| 欧美视频在线播放| 免费在线观看一区二区| 国产精品国产a级| 亚洲国产欧美在线人成| 国产精品日韩一区二区| 欧美成人a视频| 欧美系列精品| 欧美电影在线观看完整版| 欧美涩涩视频| 一区二区高清视频在线观看| 亚洲一二三四区| 亚洲午夜影视影院在线观看| 久久成人精品| 久久视频国产精品免费视频在线 | 一区二区三区蜜桃网| 国产欧美日韩三级| 中文国产成人精品| 亚洲裸体视频| 久久综合伊人77777| 欧美亚洲专区| 国产人久久人人人人爽| 一区二区三区日韩欧美| 亚洲永久视频| 国产精品一级二级三级| 日韩亚洲一区在线播放| 亚洲视频在线观看网站| 欧美人与禽性xxxxx杂性| 亚洲激情在线激情| 欧美成人免费在线| 久久躁狠狠躁夜夜爽| 狠狠色狠狠色综合日日五| 亚洲视频一二| 欧美中文在线视频| 精品动漫av| 欧美日韩不卡合集视频| 亚洲精品在线免费观看视频| 亚洲精品在线一区二区| 欧美日韩久久| 久久精品噜噜噜成人av农村| 欧美jizz19性欧美| 久久久亚洲高清| 亚洲精品一区二区三| 久久嫩草精品久久久精品一| 亚洲精品在线观看视频| 国产资源精品在线观看| 欧美日韩精品一区二区| 理论片一区二区在线| 亚洲综合丁香| 9i看片成人免费高清| 免费亚洲电影在线| 久久深夜福利免费观看| 欧美激情第10页| 亚洲影院免费| 亚洲肉体裸体xxxx137| 欧美福利视频在线观看| 久久久综合网| 欧美在线播放高清精品| 日韩午夜精品| 一区二区三区欧美亚洲| 亚洲国产91精品在线观看| 欧美亚洲成人网| 欧美日韩精品一区视频 | 亚洲在线中文字幕| 99这里只有精品| 亚洲欧洲日韩综合二区| 一区在线观看| 亚洲欧洲一区二区在线观看| 亚洲精品国产拍免费91在线| 亚洲视频视频在线| 亚洲小少妇裸体bbw| 午夜精品久久久久99热蜜桃导演| 亚洲免费影视第一页| 久久精品视频在线| 欧美高清在线一区| 欧美激情一区二区三区四区| 欧美高潮视频| 一本久久精品一区二区| 欧美一区国产一区| 久久天堂成人| 欧美视频在线一区二区三区| 国产一区二区久久精品| 亚洲视频第一页| 免费一级欧美片在线观看| 亚洲女同同性videoxma| 欧美国产激情| 亚洲精品视频啊美女在线直播| 午夜在线观看免费一区| 亚洲电影在线看| 欧美一区二区三区播放老司机| 欧美精品色综合| 亚洲国产精品激情在线观看| 久久久精品视频成人| 亚洲精品三级| 免费黄网站欧美| 久久国产视频网站| 国产综合网站| 久久午夜色播影院免费高清| 亚洲女优在线| 韩国福利一区| 久久婷婷国产麻豆91天堂| 亚洲综合日韩在线| 国际精品欧美精品| 久久久国产精品一区二区三区| 亚洲欧美激情视频| 国产午夜久久久久| 快播亚洲色图| 欧美日韩国产一区精品一区 | 欧美精品一区二区三区视频| 亚洲黑丝在线| 99re国产精品| 国产精品一二三| 久久精品国产亚洲aⅴ| 欧美xx69| 欧美成人一区二区三区| 亚洲综合视频网| 六月婷婷一区| 欧美一区二区在线免费观看| 美女国内精品自产拍在线播放| 亚洲国产精品一区二区第一页 | 久久精品电影| 久久福利视频导航| 亚洲午夜黄色| 裸体一区二区三区| 性高湖久久久久久久久| 蜜臀av性久久久久蜜臀aⅴ| 亚洲欧美成人网| 欧美日韩视频在线一区二区观看视频 | 香蕉久久国产| 欧美国产日韩a欧美在线观看| 亚洲欧美国产精品桃花| 久久裸体艺术| 国产一区二区三区的电影 | 久久精品日韩欧美| 久久精品国产99精品国产亚洲性色 | 亚洲一区二区三区精品在线| 欧美顶级少妇做爰| 最新日韩精品| 亚洲免费成人av| 欧美视频一区二区三区…| 亚洲精品久久久蜜桃|