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

隨筆-38  評論-23  文章-0  trackbacks-0

      關于碰撞檢測,始終是物理系統在圖形學運用上的一個比較復雜的問題.碰撞檢測做的好不好.完全決定一個場景漫游的逼真性.
     這幾天,在坐城市汽車仿真處理上,對于驅動汽車運動時候,對于汽車的碰撞檢測問題困擾了我相當的久.始終沒能做到很好.這當中我現在使用的汽車包圍體對場景進行求交測試時候,用到了OSG中PolytopeIntersector.
     對于一個Polytope 應當是多個平面組成的一個空間區域,對于OSG求交器當中,這個多面體各個平面的正面必須都是屬于這個區域內的? 怎么解釋呢.平面的法線應當是指向該空間區域內部.比如說一個四面體.其內部的四個面應當是正面(法線朝向的方向那個面.) 這是多面體求交器使用的一個關鍵.(這在之后的代碼解讀當中會一并解釋).

     對于OSG場景求交測試,是必然要用到訪問器的(Vistor.這個應當在在另辟一篇文章才能詳述清楚,它的使用原理,因此這里我們暫時先用著.) 對于求交器使用到的訪問器(Vistor)應當是交集訪問器(IntersectionVistor).

    因此,我們在定義上則應當是如下:

    /** 創建一個多面體求交器*/
    osgUtil::PolytopeIntersector
* pI =new osgUtil::PolytopeIntersector(poly);
    
/** 構造一個交集訪問器*/
    osgUtil::IntersectionVisitor iv(pI);
    對于求交集 則應當對于場景根節點做請求訪問的操作..這當中可能需要避開自身節點等一些不必要的節點等.
    /** 設置避開自身節點*/
    _model
->setNodeMask(0x0);
    
/** 根節點請求訪問操作*/
    root
->accept(iv);
    
/** 恢復自身節點的NodeMask*/
    _model
->setNodeMask(0xffffffff);

     對于setNodeMask()避開節點等.我想應當在Vistor中在詳述..
     再對于訪問操作之后,我們就可以獲得所返回的交集了.
    
    if(pI->containsIntersections())
    
{
        typedef osgUtil::PolytopeIntersector::Intersections inters;
        
for(inters::iterator it=pI->getIntersections().begin();\
            it
!=pI->getIntersections().end();it++)
            
/** ……*/
    }

     固然,這些只是相對于簡單的操作.而我們是想要深入到了解在root->accept(iv)之后到底做了什么事情?它到底如何求得了我們想要的數據? 那現在開始我們的代碼解讀之旅……當然這其中,我想有必要略去一些關系到Vistor的內容.因為這些詳述起來,不是簡短的能夠說的清楚...

     現在我們定位到: osgUtil/IntersectionVisitor.cpp 第226行:
     

apply(osg::Geode& geode)

 

    因為geode是葉子節點,最后肯定都會請求到它,并訪問..其中的代碼我們將能夠非常直觀的看出它將要干嘛?
對于geode下的所有可繪制圖元進行求交.因此我們現在將轉到 intersect函數

    定位到: include/osgUtil/IntersectionVisitor.h 第245行:
   

intersect


    關于_intersectorStack 是個求交器的集合,我們在構造的時候將PolytopeIntersector傳入后將會被加入到這個集合當中..因此 這將會回到PolytopeIntersector中的intersect函數..因此,我們又得重新打開polytope那個文件咯..
    定位到 osgUtil/PolyIntersector.cpp 第547行..
   

 

PolytopeIntersector::intersect


     我們可以看到再用 PolytopePrimitiveIntersector 構造了一個func 后(并設置多面體,和參考平面) 對于drawable進行訪問操作?似乎又回到vistor...? 其實這個只是類似的操作,但還算不上vistor..暫時當作類似的對待吧..雖然Vistor模式在OSG中的運用非常的多..而且幾乎處處都會用到..這個時候我們將要進入一個關鍵時刻,因為我們知道.在osg中drawable里頭已經是最后的頂點等所有數據存放的地方.drawable其實只是個抽象類.這里我只會簡單的通過它的一個特例:Geometry 來講述這一段內容..
所以現在  我們將定位在osg/Geometry.cpp 第2199行:
     

void Geometry::accept(PrimitiveFunctor& functor) const

      對于這個操作,我們暫時只看不存在索引數據的..因為相對于來講原理總是一樣的.后面的只是多了一些步驟將頂點數據取出..好了.我們回到正題.
       functor.setVecterArray() 很直觀的明白,將頂點數據存到fuctor里.以便于在之后functor操作.
      
      其后最主要的還是在于對于drawable里的每個primitiveset 進行接受fuctor訪問操作 (*itr)->accept(functor);
我們知道.primitiveset里頭擁有的數據是頂點最后繪制的規則. 相當于我們在OPENGL當中使用glBegin() glEnd()一樣指定最后基礎圖元生成的規則.而我們所要求交集的目的在于獲得跟這些基礎圖元的交集.因此.我們有必要繼續往下深究.我們還沒有嗅到最終結果,還不能夠放棄. 好了 繼續..PrimitiveSet又是一個虛類.因此,我們有必要挑個實體類來深究.就選DrawArray吧. DrawArray指定一個MODE,頂點的起始位置,以及參與繪制的頂點的總數目..
MODE 就相當于 GL_LINES GL_TRIANGLES 等等.我們再次回到代碼來說吧.
       這次我們將定位在: osg/PrimitiveSet.cpp 第43行:
       很簡單...
DrawArrays::accept
        所以最終的結果 都將回到fuctor里頭進行交集運算的處理..._mode _first _count 將擁有的規則送往fuctor..

       在追究了這么多之后,我們又需要回到functor里頭.這個functor 是什么呢? 還記得我之前說的使用PolytopePrimitiveIntersector 構造了一個func對不? 所有的關鍵將在那里揭開....最后的結果總還是深藏于原來的最初的起點位置..不過我想還真不枉繞了一圈...
      在我們回到func 之前我們還需要深究下functor.drawArrays() 這個函數到底做了什么? 因為在PolytopePrimitiveIntersector當初我們并未發現有這個函數.PolytopePrimitiveIntersector這個類是在PolytopeIntersector.cpp文件當中定義的.它只有一大堆的operator()操作...因此我們需要回到構造它的那個functor()里頭..
現在我將定位到 include/osg/TemplatePrimitiveFunctor.h  第90行..
     
drawArrays(GLenum mode,GLint first,GLsizei count)

        對于此,我們暫時只觀看最簡單的GL_TRIANGLES ,對于三角形的每三個點將會繪制一個三角形.因此每次只取三個頂點,將它傳遞給當前構造的func0>operator()處理.這就是為什么 func里頭全部是都是operator()操作了..
       我們弄明白這些之后,馬上回到PolytopePrimitiveIntersector 最后的結果.令人期待啊...
       PolytopePrimitiveIntersector中的operator()支持很多種類型,.參數的不同,一個點(points)(兩個點)lines,三個點(Triangles),四個點(quads)

       最后定位在三角形的處理上: osgUtil/PolytopeIntersector.cpp 第208行.

       這段代碼相當的長,但是看起來非常的好理解.這里我也將解釋為什么對于多面體在定義的時候法線很重要了?  我想我有必要將這部分代碼全部解讀清楚..這部分是關鍵.
void operator()

現在將做最后的代碼解讀工作 selector_mask 當前操作平面編號的標記 inside_mask 標記三角形在哪些平面的正面?即所說在區域內..對于所有平面,將進行如下操作:
1.  d1 d2 d3 分別求得 ax+by+cz+d < = > 0 
     [ax+by+cz >0 表示點在正面這邊,=0 表示點平面上,<0則表示在背面這邊] 
     若三個點都在某個平面的背面..那說明這個三角形肯定在這個多面體的區域外.則結束..
     若三個點都在某個平面的正面,則做標記并繼續其他平面.
2.  若不是以上兩種情況,那分別判斷v1v2 v1v3 v2v3這三條線段的與平面的交點.并加入至候選頂點列表當中.

在對所有平面都進行操作之后,需要判斷幾種情況我們可以考慮?
第一.三角形剛好在多面體內部.
第二.可能這些交點落在其他平面的背面了.
第三 可能三條邊與平面是存在交點.但是多面體的組成的閉合區域卻剛好穿過三角形內部.這個時候必須對平面的交線與三角形求交點..

所以這三個部分完全概括了上面的代碼?是的.我想這個部分并不需要我講的有多么詳細了.很容易理解的.

其后,我還想深究下最后這個交集會存放到哪里去了?我們最終該如何使用獲得交集才能夠更好被我們所利用?

    addIntersection(_index, _candidates);

    對于每處理一個三角形 _index 都會在開頭部分自增..因此 對于Intersections中的每一個交集的點都針對于同一個三角形..(對于別的同理可得?) 也就是說_index表示在primitiveSet當中.這個三角形是第幾個三角形.(三角形序號)
    最后,我們再次回到我們最開始進入這么大段篇幅討論的起始位置吧?還記得否?我們第二個intersect()函數..就是PolytopeIntersector類中的..因為我們最后的結果總會回歸到我們需要的地方.所以我們現在得回到那里去取得我們最終獲得的數據/.
   
結果如何?

      對于從func中獲得的交集.我們將需要將它變成我們所需要的數據.我將一一解釋最終我們得到的每個數據的含義:
     hit.distance // 表示從當前這個交集的所有頂點的中心點到參考平面的距離.
     hit.primitiveIndex //表示之前我們說的這個圖元在PrimitiveSet中的序號.
     hit.nodepath  //表示這個從根結點到當前這個geode的路徑..因為我們知道在vistor中我們有pushNodepath() popNodePath()來保存這個路徑操作..所以這個路徑是從vistor中獲得的.
     hit.drawable //當然是我們保存著當前這個交集是對于哪個drawable.
     hit.matrix   //表示當前這個drawable應當在世界坐標系的變換矩陣.我們可以使用point*matrix 來得到獲得點在世界坐標系下的位置..
     hit.localIntersecotPoint  //表示所有交點的中心點.
     hit.intersectorPoint //所有交點的一個數組..目前最多的頂點個數應該是6..  enum { MaxNumIntesectionPoints=6 };
     hit.numintersectorPoint // 所有頂點的個數..

我想這個解讀過程到此應當結束了...繼續學習ING.....


posted on 2009-08-02 15:03 米游 閱讀(7555) 評論(1)  編輯 收藏 引用 所屬分類: OpenGL/OSG

評論:
# re: OSG 碰撞檢測之多面體求交器代碼解讀(PloytopeIntersector) 2018-05-03 14:49 | 盧江
你好,能不能分享一下你寫的這個碰撞檢測,多面體求交的源碼呀?我最近在寫這個碰撞檢測的代碼上碰到好多問題,希望能參考一下你的代碼,不勝感激!(我的郵箱:313741269@qq.com)  回復  更多評論
  
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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精品国自产| 亚洲精品中文字幕女同| 国产人妖伪娘一区91| 亚洲第一页自拍| 国产九九视频一区二区三区| 蜜桃精品久久久久久久免费影院| 欧美激情视频一区二区三区不卡| 亚洲男女自偷自拍| 美日韩免费视频| 久久天天躁夜夜躁狠狠躁2022 | 亚洲视频一区二区在线观看| 久久av在线| 一区二区三区回区在观看免费视频| 亚洲在线免费视频| 亚洲另类视频| 久久精品日韩一区二区三区| 亚洲无亚洲人成网站77777| 久久久999精品| 亚洲欧美一区在线| 先锋影音网一区二区| 久久久久**毛片大全| 亚洲欧美日本伦理| 欧美另类一区| 嫩草影视亚洲| 国产亚洲综合精品| 亚洲一区二区三区精品在线| 日韩视频免费| 蜜臀久久99精品久久久久久9| 小处雏高清一区二区三区| 欧美激情一区三区| 欧美国产综合视频| 一区在线观看| 欧美一区二区三区免费视| 亚洲女人天堂成人av在线| 欧美久久一级| 亚洲精品国精品久久99热| 亚洲第一综合天堂另类专| 欧美在线精品免播放器视频| 西西裸体人体做爰大胆久久久| 欧美日韩国产黄| 亚洲欧洲精品一区二区三区波多野1战4| 娇妻被交换粗又大又硬视频欧美| 亚洲综合色网站| 午夜精品福利电影| 国产精品一区免费观看| 亚洲香蕉在线观看| 午夜宅男欧美| 国产字幕视频一区二区| 欧美一区二区黄色| 免费黄网站欧美| 亚洲欧洲午夜| 欧美精品一区在线播放| 亚洲精品日韩在线| 一区二区三区久久久| 欧美四级剧情无删版影片| 亚洲午夜精品久久久久久app| 亚洲欧美日韩国产综合| 国产日韩三区| 美女脱光内衣内裤视频久久影院| 欧美激情一区二区三区成人| 亚洲精品欧美专区| 欧美三级在线| 欧美亚洲色图校园春色| 久久久噜噜噜久噜久久| 在线观看av一区| 欧美夫妇交换俱乐部在线观看| 欧美激情四色| 亚洲免费视频成人| 黑人一区二区| 欧美日韩高清免费| 午夜视频在线观看一区二区| 免费毛片一区二区三区久久久| 亚洲国产专区| 国产精品日韩欧美一区二区三区| 欧美亚洲视频在线看网址| 亚洲第一天堂av| 午夜日韩在线观看| 亚洲青色在线| 国产一区二区三区在线观看网站| 嫩草成人www欧美| 亚洲香蕉网站| 亚洲人被黑人高潮完整版| 欧美一级在线视频| 亚洲黄网站在线观看| 国产精品人人爽人人做我的可爱 | 久久久久九九视频| 日韩视频免费大全中文字幕| 久久久精品一区二区三区| 99视频精品| 黄色在线一区| 国产精品夜夜夜一区二区三区尤| 噜噜噜躁狠狠躁狠狠精品视频| 国产精品99久久久久久久女警| 麻豆成人在线播放| 性欧美长视频| 在线亚洲精品福利网址导航| 激情欧美一区二区三区在线观看 | 久久亚洲精选| 欧美诱惑福利视频| 亚洲在线成人| 9l国产精品久久久久麻豆| 亚洲国产美女| 蜜桃av久久久亚洲精品| 久久国产精品一区二区| 亚洲视屏在线播放| 一本到高清视频免费精品| 在线精品视频一区二区| 国产亚洲亚洲| 国产日韩欧美综合精品| 国产精品久久久久久久午夜 | 欧美一区二区三区啪啪| 宅男精品视频| 99综合视频| 一区二区日韩| 99一区二区| 中文有码久久| 亚洲小说欧美另类婷婷| 在线中文字幕一区| 亚洲天堂黄色| 亚洲欧美另类综合偷拍| 亚洲综合欧美| 午夜久久久久久久久久一区二区| 亚洲午夜精品久久久久久app| 一区二区三区日韩精品| 一区二区三区成人| 亚洲视频欧洲视频| 亚洲综合视频1区| 欧美在线不卡| 久久人人九九| 欧美激情第五页| 欧美日韩一本到| 国产精品欧美久久久久无广告| 国产精品国码视频| 国产日韩精品一区二区三区 | 欧美日韩一区二区三区高清| 欧美日韩美女一区二区| 国产精品成人一区二区三区夜夜夜| 欧美伦理影院| 国产伦精品一区二区三区在线观看| 国产精品一区二区三区乱码| 狠狠色伊人亚洲综合网站色| 国产精品日韩欧美综合| 亚洲一区在线播放| 亚洲综合大片69999| 国产精品99一区二区| 久久久99免费视频| 亚洲国内自拍| 久久久美女艺术照精彩视频福利播放| 亚洲一区二区三区乱码aⅴ蜜桃女| 狠狠色丁香久久综合频道| 亚洲韩日在线| 亚洲欧美区自拍先锋| 久久久噜久噜久久综合| 亚洲第一天堂av| 亚洲男人的天堂在线aⅴ视频| 久久狠狠一本精品综合网| 免费h精品视频在线播放| 国产精品成人播放| 亚洲国产成人精品女人久久久 | 国产精品国产三级国产普通话99| 欧美激情一区二区三区蜜桃视频| 亚洲每日在线| 午夜精品在线| 欧美黄色一级视频| 国产亚洲欧美激情| 亚洲视频网在线直播| 久久久久久一区二区三区| 欧美日韩福利| 亚洲国产1区| 久久国产精品电影| 亚洲激情一区| 久久精品五月婷婷| 国产精品在线看| 99精品欧美一区二区三区| 葵司免费一区二区三区四区五区| 亚洲精品综合久久中文字幕| 久久午夜视频| 好吊妞**欧美| 久久黄色网页|