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

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>
            久久久噜噜噜久久中文字幕色伊伊| 久久国产精品一区二区三区四区| 欧美高清视频一区二区| 久久久久女教师免费一区| 激情小说另类小说亚洲欧美| 久久青青草原一区二区| 久久一区精品| 亚洲美女免费视频| 亚洲视频精品在线| 国内精品福利| 亚洲福利电影| 欧美日韩一区二区在线| 欧美一区二区三区四区在线观看| 午夜精品久久久久久久| 国内精品久久久久久久97牛牛| 免费亚洲电影在线| 欧美精品在线一区| 久久精品国产清自在天天线| 久久日韩粉嫩一区二区三区| 99国产精品国产精品毛片| 亚洲男人第一网站| 最新69国产成人精品视频免费| 夜夜嗨av一区二区三区四季av| 国产亚洲精品7777| 亚洲激情av| 国产亚洲毛片在线| 亚洲国产日韩欧美| 国产精品一区免费观看| 亚洲国产精品一区在线观看不卡 | 欧美在线一区二区| 欧美成人亚洲| 久久国内精品自在自线400部| 美女日韩在线中文字幕| 亚洲欧美日韩系列| 欧美精品免费在线| 蜜臀av国产精品久久久久| 欧美午夜女人视频在线| 欧美福利视频| 国产一区二区三区电影在线观看 | 亚洲少妇在线| 免费亚洲电影| 久久在线观看视频| 国产精品丝袜久久久久久app| 亚洲激情视频在线播放| 黄色成人免费网站| 午夜精品视频| 午夜精品福利视频| 欧美午夜不卡影院在线观看完整版免费| 久久久国际精品| 国产精品久久久久久户外露出| 欧美国产日韩视频| 在线观看三级视频欧美| 午夜在线播放视频欧美| 亚洲男人影院| 欧美色中文字幕| 亚洲欧洲日本mm| 亚洲经典在线看| 久久人人爽人人爽爽久久| 久久久精品日韩| 国产区日韩欧美| 亚洲欧美日韩国产成人精品影院 | 国产日韩精品一区二区三区在线 | 亚洲国产精品日韩| 亚洲精品一区在线观看香蕉| 免费视频最近日韩| 亚洲激情成人| 在线视频欧美日韩| 欧美日韩亚洲国产精品| 亚洲精品影视| 亚洲一区在线播放| 国产精品久久久久久久久久久久| 一区二区三区国产盗摄| 亚洲综合精品四区| 国产麻豆午夜三级精品| 欧美尤物巨大精品爽| 久久久久久穴| 亚洲成人在线网站| 欧美激情一区二区三区高清视频| 91久久精品www人人做人人爽| 亚洲黄色免费网站| 欧美日韩在线视频一区| 99国产精品久久久久久久久久 | 久久综合免费视频影院| 亚洲国产精品免费| 欧美日韩精品久久久| 一区二区日韩欧美| 久久九九国产| 91久久综合亚洲鲁鲁五月天| 欧美色一级片| 久久久av水蜜桃| 亚洲激情视频在线观看| 午夜电影亚洲| 亚洲福利电影| 国产精品v欧美精品∨日韩| 午夜老司机精品| 欧美激情一区二区三区蜜桃视频| 日韩亚洲欧美中文三级| 国产精品专区h在线观看| 久久久精品午夜少妇| 亚洲免费观看高清在线观看| 欧美一级在线视频| 亚洲日本成人网| 国产精品一区二区久激情瑜伽| 久久久噜噜噜久久狠狠50岁| 99精品国产在热久久婷婷| 久久久久久久综合| 中文国产成人精品久久一| 国产色婷婷国产综合在线理论片a| 免费成人高清| 羞羞视频在线观看欧美| 亚洲欧洲一区二区天堂久久| 欧美一区在线看| 一区二区三区欧美视频| 黄页网站一区| 国产精品尤物福利片在线观看| 女仆av观看一区| 久久爱www久久做| 亚洲一区二区三区午夜| 91久久精品一区二区三区| 久久精品网址| 久久成人综合网| 亚洲一区二区3| 日韩一级成人av| 亚洲国产一区二区三区在线播| 国产农村妇女毛片精品久久莱园子| 欧美精品一线| 免费日韩av电影| 久久久久国产精品麻豆ai换脸| 亚洲一区二区免费| 一级日韩一区在线观看| 亚洲欧洲日韩在线| 欧美激情导航| 欧美激情按摩| 亚洲成人在线免费| 欧美日本在线观看| 免费在线亚洲| 女女同性精品视频| 欧美aⅴ99久久黑人专区| 久久精品一区二区三区不卡| 亚洲欧美激情精品一区二区| 中国女人久久久| 中国av一区| 午夜精品在线看| 午夜精品福利一区二区三区av| 亚洲视频一二区| 亚洲香蕉视频| 午夜视频一区二区| 欧美尤物巨大精品爽| 久久久xxx| 蜜桃视频一区| 欧美黑人在线观看| 欧美日韩国语| 欧美视频在线观看免费网址| 欧美三日本三级少妇三2023| 欧美午夜在线观看| 国产精品永久免费观看| 黑人一区二区三区四区五区| 在线免费日韩片| 99在线热播精品免费99热| 一区二区三区欧美亚洲| 午夜精品一区二区三区四区| 久久精彩视频| 欧美激情一二区| 亚洲乱码日产精品bd| 亚洲一区日韩| 久久久91精品国产| 欧美理论电影在线播放| 国产精品久久久999| 韩国成人理伦片免费播放| 亚洲国产一区二区a毛片| 亚洲一区日韩在线| 久久久综合精品| 亚洲国产精品高清久久久| 亚洲少妇自拍| 久久免费高清视频| 欧美日韩免费观看一区| 国产自产精品| av不卡免费看| 久久一综合视频| 夜夜嗨一区二区| 久久久久国产精品人| 欧美午夜电影网| 亚洲第一成人在线| 亚洲欧美在线视频观看| 欧美成人精品三级在线观看| 亚洲视频欧美在线| 麻豆亚洲精品| 国产精品永久在线| 一区二区欧美激情| 久久亚洲捆绑美女| 亚洲图片在线观看| 女同性一区二区三区人了人一| 国产美女在线精品免费观看| 亚洲精品影院在线观看| 久久视频免费观看| 亚洲午夜视频在线观看| 欧美 日韩 国产 一区| 国产一区二区三区在线免费观看| 宅男噜噜噜66一区二区66| 欧美成人精品高清在线播放|