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

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>
            女人色偷偷aa久久天堂| 国产精品社区| 亚洲二区视频| 亚洲韩国青草视频| 欧美国产日本在线| 亚洲一区bb| 亚洲综合社区| 好看的日韩视频| 亚洲黄色免费电影| 欧美午夜精品久久久久免费视| 亚洲欧美日韩国产综合| 亚洲欧美综合网| 亚洲福利在线观看| 亚洲精品一区二区网址| 国产精品一区二区黑丝| 欧美风情在线观看| 欧美日韩在线一区二区| 久久久av水蜜桃| 欧美激情一区二区三区不卡| 亚洲视频在线观看视频| 欧美一二区视频| 亚洲最黄网站| 欧美在线观看一二区| 日韩视频在线观看一区二区| 亚洲一二三区精品| 亚洲国产视频a| 一本到12不卡视频在线dvd| 国产在线欧美日韩| 亚洲免费观看高清完整版在线观看| 国产女主播一区| 最新日韩在线视频| 国产亚洲欧美日韩一区二区| 亚洲激情欧美| 激情久久中文字幕| 亚洲私人影院| 亚洲美女区一区| 久久久久91| 久久精品国产77777蜜臀| 欧美另类高清视频在线| 久久网站热最新地址| 国产精品盗摄久久久| 亚洲韩国精品一区| 在线观看一区视频| 欧美一级黄色录像| 欧美一区二区三区男人的天堂| 欧美日韩国产在线| 欧美激情亚洲激情| 影音先锋日韩精品| 久久精品99国产精品酒店日本| 午夜久久福利| 国产精品免费看久久久香蕉| 亚洲国产另类久久久精品极度| 伊人婷婷欧美激情| 欧美中文字幕不卡| 久久久综合网站| 国内精品免费在线观看| 欧美在线啊v一区| 久久成人免费视频| 国产亚洲欧美一区二区三区| 亚洲一区二区三区中文字幕在线 | 国产精品免费网站| 日韩视频一区二区三区| 99精品久久| 欧美激情亚洲视频| 最新中文字幕亚洲| 日韩一区二区电影网| 欧美精品在线一区二区| 亚洲精品影视| 一区二区三区国产精品| 欧美日韩亚洲一区三区| 日韩视频一区二区三区在线播放| 日韩视频在线播放| 欧美日韩一本到| 亚洲视屏在线播放| 久久久999精品| 影音先锋久久资源网| 美女视频网站黄色亚洲| 亚洲国产精品久久久久秋霞不卡 | 在线观看91久久久久久| 毛片一区二区| 亚洲精选视频免费看| 亚洲欧美日韩精品久久久| 国产亚洲精品久久久| 久久久不卡网国产精品一区| 欧美刺激午夜性久久久久久久| 亚洲电影在线看| 国产精品99一区| 久久精品青青大伊人av| 亚洲国产第一| 欧美一二三区精品| 亚洲福利国产精品| 欧美性猛交xxxx乱大交退制版| 亚洲一区二区在线看| 欧美风情在线观看| 亚洲欧美日韩视频二区| 国外成人在线| 欧美日韩日韩| 久久九九热免费视频| 最新69国产成人精品视频免费| 亚洲欧美色一区| 亚洲国产女人aaa毛片在线| 欧美日韩免费在线| 久久亚洲风情| 亚洲午夜免费视频| 欧美激情精品久久久久久蜜臀 | 性感少妇一区| 亚洲高清成人| 国产精品久久久久久久久久直播 | 欧美成在线观看| 亚洲欧美区自拍先锋| 欧美激情精品久久久六区热门| 午夜精品www| 亚洲欧洲日产国码二区| 国产麻豆视频精品| 欧美日本韩国在线| 久久婷婷亚洲| 久久xxxx| 亚洲欧美日韩一区| 亚洲精品三级| 欧美激情免费观看| 玖玖玖国产精品| 亚洲欧美中文日韩v在线观看| 亚洲欧洲一区二区天堂久久 | 欧美不卡视频一区| 久久久国产精品亚洲一区| 亚洲一区在线观看免费观看电影高清| 欧美成人精品在线播放| 久久gogo国模啪啪人体图| 亚洲性人人天天夜夜摸| 亚洲激情网站| 亚洲国产成人高清精品| 尤物yw午夜国产精品视频明星| 国产精品入口尤物| 欧美日韩在线大尺度| 欧美日本高清| 欧美人成网站| 欧美日本亚洲韩国国产| 欧美国产视频在线观看| 久久久久久69| 久久都是精品| 久久精品国产亚洲5555| 欧美一区中文字幕| 欧美一区影院| 久久精品一本| 久久久久久一区| 久久久激情视频| 美国十次了思思久久精品导航| 久久综合九色99| 美女日韩在线中文字幕| 欧美 日韩 国产在线| 麻豆成人综合网| 欧美电影免费观看大全| 欧美日韩高清在线观看| 欧美日韩亚洲一区二区三区在线 | 欧美福利小视频| 欧美日韩国产在线观看| 国产精品v片在线观看不卡| 国产精品激情av在线播放| 国产日韩欧美三级| 尤物九九久久国产精品的特点| 在线成人av网站| 99视频超级精品| 亚洲欧美日韩人成在线播放| 久久精品一本| 亚洲黄色在线看| 亚洲视频网站在线观看| 久久av免费一区| 欧美成人四级电影| 国产精品h在线观看| 国内精品免费在线观看| 亚洲精选一区| 欧美一区二区三区精品| 欧美成人日本| 亚洲一区二区三区高清| 久久影视精品| 国产精品乱码一区二三区小蝌蚪| 狠狠色丁香婷婷综合影院| 亚洲开发第一视频在线播放| 亚洲欧美日韩直播| 欧美福利专区| 亚洲欧美成人网| 免费亚洲一区二区| 国产精品午夜国产小视频| 亚洲第一毛片| 性做久久久久久久免费看| 亚洲二区视频在线| 香蕉av777xxx色综合一区| 欧美精品在线网站| 伊人久久久大香线蕉综合直播| 在线一区二区三区四区| 久久躁日日躁aaaaxxxx| 亚洲网站在线观看| 欧美激情一区在线| 一区二区在线观看视频| 亚洲在线第一页| 日韩午夜电影在线观看| 久久综合五月| 一区二区在线不卡| 久久大逼视频| 亚洲影音先锋|