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

隨筆-38  評(píng)論-23  文章-0  trackbacks-0

      關(guān)于碰撞檢測(cè),始終是物理系統(tǒng)在圖形學(xué)運(yùn)用上的一個(gè)比較復(fù)雜的問(wèn)題.碰撞檢測(cè)做的好不好.完全決定一個(gè)場(chǎng)景漫游的逼真性.
     這幾天,在坐城市汽車仿真處理上,對(duì)于驅(qū)動(dòng)汽車運(yùn)動(dòng)時(shí)候,對(duì)于汽車的碰撞檢測(cè)問(wèn)題困擾了我相當(dāng)?shù)木?始終沒(méi)能做到很好.這當(dāng)中我現(xiàn)在使用的汽車包圍體對(duì)場(chǎng)景進(jìn)行求交測(cè)試時(shí)候,用到了OSG中PolytopeIntersector.
     對(duì)于一個(gè)Polytope 應(yīng)當(dāng)是多個(gè)平面組成的一個(gè)空間區(qū)域,對(duì)于OSG求交器當(dāng)中,這個(gè)多面體各個(gè)平面的正面必須都是屬于這個(gè)區(qū)域內(nèi)的? 怎么解釋呢.平面的法線應(yīng)當(dāng)是指向該空間區(qū)域內(nèi)部.比如說(shuō)一個(gè)四面體.其內(nèi)部的四個(gè)面應(yīng)當(dāng)是正面(法線朝向的方向那個(gè)面.) 這是多面體求交器使用的一個(gè)關(guān)鍵.(這在之后的代碼解讀當(dāng)中會(huì)一并解釋).

     對(duì)于OSG場(chǎng)景求交測(cè)試,是必然要用到訪問(wèn)器的(Vistor.這個(gè)應(yīng)當(dāng)在在另辟一篇文章才能詳述清楚,它的使用原理,因此這里我們暫時(shí)先用著.) 對(duì)于求交器使用到的訪問(wèn)器(Vistor)應(yīng)當(dāng)是交集訪問(wèn)器(IntersectionVistor).

    因此,我們?cè)诙x上則應(yīng)當(dāng)是如下:

    /** 創(chuàng)建一個(gè)多面體求交器*/
    osgUtil::PolytopeIntersector
* pI =new osgUtil::PolytopeIntersector(poly);
    
/** 構(gòu)造一個(gè)交集訪問(wèn)器*/
    osgUtil::IntersectionVisitor iv(pI);
    對(duì)于求交集 則應(yīng)當(dāng)對(duì)于場(chǎng)景根節(jié)點(diǎn)做請(qǐng)求訪問(wèn)的操作..這當(dāng)中可能需要避開(kāi)自身節(jié)點(diǎn)等一些不必要的節(jié)點(diǎn)等.
    /** 設(shè)置避開(kāi)自身節(jié)點(diǎn)*/
    _model
->setNodeMask(0x0);
    
/** 根節(jié)點(diǎn)請(qǐng)求訪問(wèn)操作*/
    root
->accept(iv);
    
/** 恢復(fù)自身節(jié)點(diǎn)的NodeMask*/
    _model
->setNodeMask(0xffffffff);

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

     固然,這些只是相對(duì)于簡(jiǎn)單的操作.而我們是想要深入到了解在root->accept(iv)之后到底做了什么事情?它到底如何求得了我們想要的數(shù)據(jù)? 那現(xiàn)在開(kāi)始我們的代碼解讀之旅……當(dāng)然這其中,我想有必要略去一些關(guān)系到Vistor的內(nèi)容.因?yàn)檫@些詳述起來(lái),不是簡(jiǎn)短的能夠說(shuō)的清楚...

     現(xiàn)在我們定位到: osgUtil/IntersectionVisitor.cpp 第226行:
     

apply(osg::Geode& geode)

 

    因?yàn)間eode是葉子節(jié)點(diǎn),最后肯定都會(huì)請(qǐng)求到它,并訪問(wèn)..其中的代碼我們將能夠非常直觀的看出它將要干嘛?
對(duì)于geode下的所有可繪制圖元進(jìn)行求交.因此我們現(xiàn)在將轉(zhuǎn)到 intersect函數(shù)

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

intersect


    關(guān)于_intersectorStack 是個(gè)求交器的集合,我們?cè)跇?gòu)造的時(shí)候?qū)olytopeIntersector傳入后將會(huì)被加入到這個(gè)集合當(dāng)中..因此 這將會(huì)回到PolytopeIntersector中的intersect函數(shù)..因此,我們又得重新打開(kāi)polytope那個(gè)文件咯..
    定位到 osgUtil/PolyIntersector.cpp 第547行..
   

 

PolytopeIntersector::intersect


     我們可以看到再用 PolytopePrimitiveIntersector 構(gòu)造了一個(gè)func 后(并設(shè)置多面體,和參考平面) 對(duì)于drawable進(jìn)行訪問(wèn)操作?似乎又回到vistor...? 其實(shí)這個(gè)只是類似的操作,但還算不上vistor..暫時(shí)當(dāng)作類似的對(duì)待吧..雖然Vistor模式在OSG中的運(yùn)用非常的多..而且?guī)缀跆幪幎紩?huì)用到..這個(gè)時(shí)候我們將要進(jìn)入一個(gè)關(guān)鍵時(shí)刻,因?yàn)槲覀冎?在osg中drawable里頭已經(jīng)是最后的頂點(diǎn)等所有數(shù)據(jù)存放的地方.drawable其實(shí)只是個(gè)抽象類.這里我只會(huì)簡(jiǎn)單的通過(guò)它的一個(gè)特例:Geometry 來(lái)講述這一段內(nèi)容..
所以現(xiàn)在  我們將定位在osg/Geometry.cpp 第2199行:
     

void Geometry::accept(PrimitiveFunctor& functor) const

      對(duì)于這個(gè)操作,我們暫時(shí)只看不存在索引數(shù)據(jù)的..因?yàn)橄鄬?duì)于來(lái)講原理總是一樣的.后面的只是多了一些步驟將頂點(diǎn)數(shù)據(jù)取出..好了.我們回到正題.
       functor.setVecterArray() 很直觀的明白,將頂點(diǎn)數(shù)據(jù)存到fuctor里.以便于在之后functor操作.
      
      其后最主要的還是在于對(duì)于drawable里的每個(gè)primitiveset 進(jìn)行接受fuctor訪問(wèn)操作 (*itr)->accept(functor);
我們知道.primitiveset里頭擁有的數(shù)據(jù)是頂點(diǎn)最后繪制的規(guī)則. 相當(dāng)于我們?cè)贠PENGL當(dāng)中使用glBegin() glEnd()一樣指定最后基礎(chǔ)圖元生成的規(guī)則.而我們所要求交集的目的在于獲得跟這些基礎(chǔ)圖元的交集.因此.我們有必要繼續(xù)往下深究.我們還沒(méi)有嗅到最終結(jié)果,還不能夠放棄. 好了 繼續(xù)..PrimitiveSet又是一個(gè)虛類.因此,我們有必要挑個(gè)實(shí)體類來(lái)深究.就選DrawArray吧. DrawArray指定一個(gè)MODE,頂點(diǎn)的起始位置,以及參與繪制的頂點(diǎn)的總數(shù)目..
MODE 就相當(dāng)于 GL_LINES GL_TRIANGLES 等等.我們?cè)俅位氐酱a來(lái)說(shuō)吧.
       這次我們將定位在: osg/PrimitiveSet.cpp 第43行:
       很簡(jiǎn)單...
DrawArrays::accept
        所以最終的結(jié)果 都將回到fuctor里頭進(jìn)行交集運(yùn)算的處理..._mode _first _count 將擁有的規(guī)則送往fuctor..

       在追究了這么多之后,我們又需要回到functor里頭.這個(gè)functor 是什么呢? 還記得我之前說(shuō)的使用PolytopePrimitiveIntersector 構(gòu)造了一個(gè)func對(duì)不? 所有的關(guān)鍵將在那里揭開(kāi)....最后的結(jié)果總還是深藏于原來(lái)的最初的起點(diǎn)位置..不過(guò)我想還真不枉繞了一圈...
      在我們回到func 之前我們還需要深究下functor.drawArrays() 這個(gè)函數(shù)到底做了什么? 因?yàn)樵赑olytopePrimitiveIntersector當(dāng)初我們并未發(fā)現(xiàn)有這個(gè)函數(shù).PolytopePrimitiveIntersector這個(gè)類是在PolytopeIntersector.cpp文件當(dāng)中定義的.它只有一大堆的operator()操作...因此我們需要回到構(gòu)造它的那個(gè)functor()里頭..
現(xiàn)在我將定位到 include/osg/TemplatePrimitiveFunctor.h  第90行..
     
drawArrays(GLenum mode,GLint first,GLsizei count)

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

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

       這段代碼相當(dāng)?shù)拈L(zhǎng),但是看起來(lái)非常的好理解.這里我也將解釋為什么對(duì)于多面體在定義的時(shí)候法線很重要了?  我想我有必要將這部分代碼全部解讀清楚..這部分是關(guān)鍵.
void operator()

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

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

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

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

    addIntersection(_index, _candidates);

    對(duì)于每處理一個(gè)三角形 _index 都會(huì)在開(kāi)頭部分自增..因此 對(duì)于Intersections中的每一個(gè)交集的點(diǎn)都針對(duì)于同一個(gè)三角形..(對(duì)于別的同理可得?) 也就是說(shuō)_index表示在primitiveSet當(dāng)中.這個(gè)三角形是第幾個(gè)三角形.(三角形序號(hào))
    最后,我們?cè)俅位氐轿覀冏铋_(kāi)始進(jìn)入這么大段篇幅討論的起始位置吧?還記得否?我們第二個(gè)intersect()函數(shù)..就是PolytopeIntersector類中的..因?yàn)槲覀冏詈蟮慕Y(jié)果總會(huì)回歸到我們需要的地方.所以我們現(xiàn)在得回到那里去取得我們最終獲得的數(shù)據(jù)/.
   
結(jié)果如何?

      對(duì)于從func中獲得的交集.我們將需要將它變成我們所需要的數(shù)據(jù).我將一一解釋最終我們得到的每個(gè)數(shù)據(jù)的含義:
     hit.distance // 表示從當(dāng)前這個(gè)交集的所有頂點(diǎn)的中心點(diǎn)到參考平面的距離.
     hit.primitiveIndex //表示之前我們說(shuō)的這個(gè)圖元在PrimitiveSet中的序號(hào).
     hit.nodepath  //表示這個(gè)從根結(jié)點(diǎn)到當(dāng)前這個(gè)geode的路徑..因?yàn)槲覀冎涝趘istor中我們有pushNodepath() popNodePath()來(lái)保存這個(gè)路徑操作..所以這個(gè)路徑是從vistor中獲得的.
     hit.drawable //當(dāng)然是我們保存著當(dāng)前這個(gè)交集是對(duì)于哪個(gè)drawable.
     hit.matrix   //表示當(dāng)前這個(gè)drawable應(yīng)當(dāng)在世界坐標(biāo)系的變換矩陣.我們可以使用point*matrix 來(lái)得到獲得點(diǎn)在世界坐標(biāo)系下的位置..
     hit.localIntersecotPoint  //表示所有交點(diǎn)的中心點(diǎn).
     hit.intersectorPoint //所有交點(diǎn)的一個(gè)數(shù)組..目前最多的頂點(diǎn)個(gè)數(shù)應(yīng)該是6..  enum { MaxNumIntesectionPoints=6 };
     hit.numintersectorPoint // 所有頂點(diǎn)的個(gè)數(shù)..

我想這個(gè)解讀過(guò)程到此應(yīng)當(dāng)結(jié)束了...繼續(xù)學(xué)習(xí)ING.....


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

評(píng)論:
# re: OSG 碰撞檢測(cè)之多面體求交器代碼解讀(PloytopeIntersector) 2018-05-03 14:49 | 盧江
你好,能不能分享一下你寫的這個(gè)碰撞檢測(cè),多面體求交的源碼呀?我最近在寫這個(gè)碰撞檢測(cè)的代碼上碰到好多問(wèn)題,希望能參考一下你的代碼,不勝感激!(我的郵箱:313741269@qq.com)  回復(fù)  更多評(píng)論
  
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            欧美一区二区三区视频| 亚洲精品中文字幕女同| 性欧美大战久久久久久久免费观看| 欧美国产三区| 欧美一区二区三区视频| 欧美三区视频| 久久精品道一区二区三区| 久久夜色精品国产亚洲aⅴ| 夜夜嗨av一区二区三区中文字幕| 你懂的国产精品| 国产精品福利网| 一本色道婷婷久久欧美| 激情一区二区| 欧美日韩一区二区三区高清| 亚洲图片欧美午夜| 久久婷婷亚洲| 亚洲一级二级在线| 亚洲国产天堂网精品网站| 蜜臀a∨国产成人精品| 国产精品一区久久| 性欧美8khd高清极品| 蜜臀av一级做a爰片久久| 一区二区三区色| 国产欧美日韩免费| 国产精品永久| 欧美日韩一级片在线观看| 99在线精品观看| 欧美国产视频一区二区| 亚洲一区二区三区在线观看视频| 国产日韩精品一区二区三区在线 | 先锋影音久久久| 精品动漫3d一区二区三区免费版 | 亚洲综合视频在线| 久久久久欧美精品| 亚洲午夜一级| 国产欧美日韩在线观看| 欧美日韩另类国产亚洲欧美一级| 久久精品一区二区国产| 亚洲老司机av| 中日韩午夜理伦电影免费| 亚洲毛片在线| 亚洲精品中文字| 亚洲免费在线视频| 亚洲色图在线视频| 一区二区高清在线| 夜夜嗨av色综合久久久综合网| 国产精品一区久久久久| 欧美国产乱视频| 欧美日韩ab| 国产亚洲精品v| 在线日韩日本国产亚洲| 国产在线乱码一区二区三区| 欧美国产日韩一区二区三区| 欧美国产1区2区| 久久国产一区二区三区| 久久一二三国产| 国产精品视频免费在线观看| 欧美久久视频| 久久久精品国产一区二区三区| 亚洲影院在线观看| 久久天天躁狠狠躁夜夜爽蜜月| 久久久免费精品| 久久久久这里只有精品| 欧美日韩亚洲成人| 欧美区亚洲区| 国产精品久久国产精品99gif| 日韩网站在线看片你懂的| 午夜一区二区三区在线观看| 亚洲第一综合天堂另类专| 亚洲欧洲日本在线| 欧美激情精品久久久久久免费印度 | 亚洲国产精品悠悠久久琪琪| 亚洲精品美女久久久久| 美国十次成人| 欧美日韩ab| 亚洲精品免费网站| 欧美黄在线观看| 亚洲电影在线看| 亚洲欧美日韩国产一区二区| 久久精品理论片| 一区二区三区鲁丝不卡| 欧美日韩三区四区| 国内揄拍国内精品久久| 9久草视频在线视频精品| 欧美精品乱人伦久久久久久 | 亚洲一区二区三区免费观看| 久久久.com| 欧美精品日韩一区| 一区在线视频| 欧美xx69| 欧美丝袜一区二区三区| 亚洲电影在线免费观看| 国产九九精品视频| 免播放器亚洲一区| 狠狠色综合一区二区| 久久综合九色九九| 国内精品亚洲| 一区二区久久| 国内激情久久| 午夜精品网站| 亚洲影视综合| 欧美www在线| 麻豆精品一区二区综合av| 国产综合色在线视频区| 亚洲欧美激情一区| 国产精品一区二区久久久| 欧美一级专区免费大片| 在线亚洲欧美| 欧美成人免费在线| 久久一区中文字幕| 国产精品大片| 欧美精品午夜| 蜜乳av另类精品一区二区| 欧美手机在线| 亚洲视频免费观看| 经典三级久久| 亚洲一区高清| 亚洲视频欧美视频| 欧美日韩一区二区在线| 亚洲大片在线| 99精品热视频| 欧美剧在线免费观看网站| 亚洲精品影院在线观看| 在线观看久久av| 久久精品色图| 欧美激情亚洲精品| 国产一区二区三区久久悠悠色av | 小处雏高清一区二区三区| 国产精品免费区二区三区观看| 亚洲综合精品自拍| 久久九九99| 国产亚洲午夜| 亚洲一区二区不卡免费| 亚洲一区二区三区中文字幕| 国产精品激情偷乱一区二区∴| 日韩视频一区二区三区在线播放免费观看 | 亚洲午夜久久久久久久久电影院| 欧美福利在线观看| 亚洲人成网站999久久久综合| 伊人久久成人| 国产综合视频在线观看| 欧美喷水视频| 久久久久国产精品麻豆ai换脸| 欧美激情视频一区二区三区不卡| 久久综合久久美利坚合众国| 午夜精品久久久久影视| 亚洲欧洲在线看| 国产午夜精品视频免费不卡69堂| 国产精品色在线| 国产精品一区二区女厕厕| 国产精品毛片a∨一区二区三区|国| 久久先锋影音| 久久精选视频| 欧美r片在线| 国产精品久久二区| 雨宫琴音一区二区在线| 亚洲毛片视频| 亚洲一级二级| 女同一区二区| 一本不卡影院| 亚洲伊人伊色伊影伊综合网| 亚洲午夜电影在线观看| 久久久国产视频91| 国产精品福利影院| 亚洲精品综合在线| 亚洲天堂av图片| 老色鬼久久亚洲一区二区| 欧美jjzz| 欧美一级在线视频| 国产精品久久久一区麻豆最新章节| 欧美日韩伊人| 欧美日韩免费观看一区三区| 国产精品久久| 在线欧美日韩国产| 亚洲午夜精品17c| 亚洲欧美激情视频在线观看一区二区三区| 日韩手机在线导航| 欧美激情影音先锋| 日韩写真在线| 一区二区精品在线观看| 欧美高清在线视频| 亚洲一区999| 欧美成人性生活| 亚洲欧洲三级电影| 欧美国产精品劲爆| 一本一道久久综合狠狠老精东影业| 久久婷婷国产综合国色天香| 欧美日韩一区二区在线观看视频| 亚洲美女视频网| 亚洲精品123区| 久久精品国产久精国产思思| 在线欧美一区| 欧美高清视频| 国产精品国产三级国产普通话三级| 亚洲天堂成人| 香蕉成人伊视频在线观看| 国产精品极品美女粉嫩高清在线| 在线亚洲观看| 亚洲精品影视在线观看| 国产精品视频第一区|