1. 程式人生 > >OpenInventor實現碰撞檢測

OpenInventor實現碰撞檢測

0.準備工作

本文開發環境:VS2008+Qt4.8.6+Coin3D 3.1.3
功能:實現碰撞檢測
檔案:model.iv

1.介紹 SoIntersectionDetectionAction

本文利用SoIntersectionDetectionAction類實現碰撞檢測。
來看看SoIntersectionDetectionAction類:
主要用到以下函式:
① virtual void addIntersectionCallback(SoIntersectionCB * cb, void * closure = NULL);
新增碰撞發生時的回撥函式cb
② virtual void setFilterCallback(SoIntersectionFilterCB * cb, void * closure = NULL);
這個函式可以設定過濾條件,比如當某物體和指定物體發生碰撞時,使用者設定為碰撞發生,當別的碰撞即便發生,但不是使用者所關心的,則忽略該碰撞。即使用者可以通過該函式訂製碰撞發生的條件。
③apply:這個可以將該碰撞檢測Action“應用”到某個指定節點、某條指定路徑或者某些路徑等。
virtual void apply(SoNode * node);
virtual void apply(SoPath * path);
virtual void apply(const SoPathList & paths, SbBool obeysRules = FALSE);
④ typedef Resp SoIntersectionCB(void * closure, const SoIntersectingPrimitive * p1, const SoIntersectingPrimitive * p2);
該函式是碰撞發生時,(一次碰撞時兩個物體碰撞,多個物體碰撞都可以分解為兩兩碰撞),相互碰撞的兩個物體的路徑。

本示例程式中僅用到上述函式,當然了,這個類的函式還很豐富的,更多的函式以後再慢慢介紹!

2.使用示例

IDAction = new SoIntersectionDetectionAction;
//回撥函式
IDAction->addIntersectionCallback(onIntersection, NULL);
//過濾函式
IDAction->setFilterCallback(filterCB,NULL);
//應用到根節點
IDAction->apply(pRootSeparator);

接下來是宣告和定義發生碰撞時的回撥函式

SoIntersectionDetectionAction::Resp CollisionTest::onIntersection(void *userdata,
const SoIntersectingPrimitive *primitive1, const SoIntersectingPrimitive *primitive2)
{
// These two primitive have an intersection.
qDebug()<<”Intersection hit!/n”;

SoPath* primitivePath1 = primitive1->path;
for(int i=0;i<primitivePath1->getLength();i++)
{
    SoNode* tmpNode = primitivePath1->getNode(i);
    QString tmpName = tmpNode->getName().getString();
    QString tmpType = tmpNode->getTypeId().getName().getString();
    //qDebug()<<i<<"  Name:"<<tmpName<<"\tType:"<<tmpType;
}
SoPath* primitivePath2 = primitive2->path;
for(int i=0;i<primitivePath2->getLength();i++)
{
    SoNode* tmpNode = primitivePath2->getNode(i);
    QString tmpName = tmpNode->getName().getString();
    QString tmpType = tmpNode->getTypeId().getName().getString();
    //qDebug()<<i<<"  Name:"<<tmpName<<"\tType:"<<tmpType;
}
// This callback will be called for the two next colliding shapes
return SoIntersectionDetectionAction::NEXT_SHAPE;

}

上面的程式碼中,CollisionTest是我自己定義的類。在該處理函式中,並沒有實際意義的處理,只是把發生碰撞的兩個物體及其路徑上的節點型別、節點名字打印出來,便於大家理解。
接下來是定義過濾函式:

SbBool CollisionTest::filterCB(void * userdata, const SoPath * p1, const SoPath * p2)
{
qDebug()<<”filterCB”;
return true;
}
在該函式裡我也並沒有寫什麼程式碼,只是給大家示範一下。如果返回為false,則所有碰撞都會被忽略,所以使用者可以根據自己的需求訂製碰撞型別、碰撞條件等。

核心程式碼即是這樣,之後我會在CSDN上上傳相關資源,有需要的可以去下載!

相關推薦

OpenInventor實現碰撞檢測

0.準備工作 本文開發環境:VS2008+Qt4.8.6+Coin3D 3.1.3 功能:實現碰撞檢測 檔案:model.iv 1.介紹 SoIntersectionDetectionAction 本文利用SoIntersectionDetecti

在2D空間中使用四叉樹實現碰撞檢測

引言: 碰撞檢測是大部分視訊遊戲的關鍵部分。不管在2D還是3D遊戲裡,檢測兩個物體發生碰撞是非常重要的,一個小小的碰撞檢測可以為遊戲加分不少。但是,碰撞檢測一種花費巨大的操作。比如說,現在有一百個物體需要檢測是否發生了碰撞,兩兩物體比較後需要執行操作10000次——這樣的

js實現碰撞檢測

碰撞檢測 目錄 程式碼例項 與簡易拖拽的差異 下載原始碼連結 程式碼例項 <div id="box" style="background: #334;width: 100px;height: 100px;position: absolute;cur

unity_小功能實現碰撞檢測

dbo pla 打開 ide 發生 oid 區域 col 位置 unity_小功能實現(碰撞檢測) 1.觸發器Trigger:勾選IsTrigger屬性 //當player剛進入觸發區域的時刻發生觸發檢測,比如在靠近門的某個區域門一直處於開著狀態 void OnTri

【JavaScript】實現元素拖拽和碰撞檢測

function drag() { var src1 = document.getElementById("src-1"); var src2 = document.getElementById("src-2"); var src3 =

Html5 Canvas動畫基礎碰撞檢測實現

在Canvas中進行碰撞檢測,大家往往直接採用遊戲引擎(Cocos2d-JS、Egret)或物理引擎(Box2D)內建的碰撞檢測功能,好奇的你有思考過它們的內部執行機制嗎?下面將針對基本的碰撞檢測技術進行講解: 1、基於矩形的碰撞檢測 所謂碰撞檢測就是判斷物體間是否發生重疊,這裡我們假設討論的碰撞體都是矩

Unity GoldGame小遊戲實現(Collision碰撞檢測

遊戲介面: 遊戲實現思路: 遊戲開始隨機生成5個Box 鍵盤輸入控制Player移動 當Player碰撞到物體 檢測物體身上標籤  如果Tag為Box則Box銷燬 在其位置生成一個Gold 如果Tag為Gold則Gold銷燬 得分+1 遊戲實現過程: 所

cocos2d-x 旅程開始--(實現瓦片地圖中的碰撞檢測

       轉眼隔了一天了,昨天搞了整整一下午加一晚上,楞是沒搞定小坦克跟磚頭的碰撞檢測,帶著個問題睡覺甚是難受啊!還好今天弄成功了,不過感覺程式不怎麼穩定啊。而且發現自己寫的東西讓我重寫一遍的話我肯定寫不出來,還要繼續學習啊! 上次的進度:            實現

java 實現精確碰撞檢測

cnmm22 原創。 用我的方法,你可以在java 裡實現精確的斜角矩形,平行四邊形,不規則矩形,不規則多邊形與圓形的碰撞檢測。 我們知道,在java 裡有一個類,x.getRect().intersects(x1.getRect() 可以實現規則矩形的

JavaScript碰撞檢測原理及其實現

1.模擬碰撞 簡單模擬碰撞過程,用一個可以拖拽的div2去嘗試碰撞一個固定的div1(均用絕對定位) 2.碰撞檢測原理 如圖所示: 使得div分別有4個距離屬性( L(left),T(t

在Unity3D中實現簡單的碰撞檢測

要求: 當立方體Cube碰撞到地面Plane的時候,輸出碰撞物體的名稱,則表述檢測到立方體碰撞了地面。 過程: 1、搭建一個簡單的場景 a.    在新建的工程中選擇File->newScene來建立新的場景。 b.    然後在該場景中新增平面地板:GameObje

Unity 使用物理射線(Physics.Raycast),實現扇形區域碰撞檢測三種方法

Unity 使用物理射線(Physics.Raycast),實現扇形(Fan-Shaped)區域碰撞檢測。   網上已經很多實現扇形檢測的方法。大部分都是用MeshCollider實現的。而據說MeshCollider這東西很耗效能(沒有親測),所以就用射

lua實現cocos多邊形碰撞檢測

定義幾個資料型別和函式 function vec(x, y)     return {x, y} end v = vec -- shortcut function dot(v1, v2)     return v1[1]*v2[1] + v1[2]*v2[2] end fu

實例介紹Cocos2d-x中Box2D物理引擎:碰撞檢測

函數實現 pda creates pty blank oid rtu and 重構 在Box2D中碰撞事件通過實現b2ContactListener類函數實現,b2ContactListener是Box2D提供的抽象類,它的抽象函數:virtual void BeginC

“等一下,我碰!”——常見的2D碰撞檢測

數量 實現 情況 解決 app mes poi html5 測試 轉自:https://aotu.io/notes/2017/02/16/2d-collision-detection/ 在 2D 環境下,常見的碰撞檢測方法如下: 外接圖形判別法 軸對稱包圍盒(

四叉樹優化碰撞檢測

level 需要 quadtree 存在 保持 是我 node fun str 轉自:http://blog.csdn.net/qq276592716/article/details/45999831 遊戲中碰撞檢測分為兩個階段:broad phase 和 narrow

Cocos2d-x 3.0中 物理碰撞檢測中onContactBegin回調函數不響應問題

track 後來 which compare mar details egl def trac 好吧,事實上這篇也是暫時冒出來的,近期朋友要做個物理遊戲,曾經做物理還是用box2d,呃。確實要花些功夫才幹搞懂當中的精髓,可是聽講這套引擎又一次封裝了一次。要easy非

7, 碰撞檢測, 精確非精確

graphics ner c const 檢測 16px nds extend objectc private import tr = egret.sys.tr; class Main extends egret.DisplayObjectContainer {

CSMA/CD協議(載波偵聽多路訪問/碰撞檢測) 最小幀長理解

ges 傳輸 分享 png 理解 時延 cnblogs mage csma/cd 以下的幀長有的是指幀的時間長度,幀的時間長度= 幀長/傳輸時延 CSMA/CD協議(載波偵聽多路訪問/碰撞檢測) 最小幀長理解

canvas遊戲和動畫中的碰撞檢測

底部 bsp rect circle 進行 eight nbsp odi word 碰撞檢測關鍵步驟 碰撞檢測需要處理經歷下面兩個關鍵的步驟: 計算判斷兩個物體是否發生碰撞 發生碰撞後,兩個物體的狀態和動畫效果的處理 計算碰撞 只要兩個物體相互接觸,它們就會發生碰撞