1. 程式人生 > >Box2D C++ 教程-射線投射

Box2D C++ 教程-射線投射

射線投射經常用來找出部分物理世界當中已經存在的物件。所謂射線就是一條直線,我們可以通過使用Box2D當中提供的方法來檢測是否與某個定製器(fixture)有交點。我們也可以找出與定製器交點的法線。

下面就是上面我提到的方法,如果射線與某個定製器發生碰撞則返回true。這裡需要注意的是此方法是b2Fixture類的一個成員,這也就是說首先我們滿足一個射線對兒這個基本條件才行。

1
bool b2Fixture::RayCast(b2RayCastOutput* output, const b2RayCastInput& input);

現在讓我們看一下輸入、輸出引數。直接從原始碼中可以看出b2RayCastInput包含了哪些引數:

1
2
3
4
5
6
// Ray-cast input data. The ray extends from p1 to p1 + maxFraction * (p2 - p1).
struct b2RayCastInput
{
    b2Vec2 p1, p2;
    float32 maxFraction;
};

p1和p2點確定了射線的方向。maxFraction表示了射線檢測到交點的距離。下面的圖可能能夠讓人一目瞭然。maxFraction等於1意味著射線段是從p1點到p2點,在此例子中顯然不能與多邊形有交點,但是maxFraction等於2就可以。

pic

下面是b2RayCastOutput包括的引數:

1
2
3
4
5
6
7
// Ray-cast output data. The ray hits at p1 + fraction * (p2 - p1), where p1 and p2
// come from b2RayCastInput.
struct b2RayCastOutput
{
    b2Vec2 normal;
    float32 fraction;
};

如果射線確實與多邊形相交,b2Fixture::RayCast將會返回true,而且我們可以通過這個輸出結構體裡的fraction引數找出交點段值(詳見上圖),還有在多邊形定製器表面生成的法線:

pic

例子

為了嘗試一下這個很方便實用的功能,讓我們建立一個場景,場景的條件為失重狀態,其中漂浮著一些多邊形。現在建立這些你應該很順手了,接下來我們在四周建立一些牆來代替四方盒子作為邊界,為的是看起來更好看。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
FooTest() {
    //a static body
    b2BodyDef myBodyDef;
    myBodyDef.type = b2_staticBody;
    myBodyDef.position.Set(0, 0);
    b2Body* staticBody = m_world->CreateBody(&myBodyDef);
    //shape definition
    b2PolygonShape polygonShape;
    //fixture definition
    b2FixtureDef myFixtureDef;
    myFixtureDef.shape = &polygonShape;
    //add four walls to the static body
    b2Vec2 bl(-20, 0);
    b2Vec2 br( 20, 0);
    b2Vec2 tl(-20,40);
    b2Vec2 tr( 20,40);
    polygonShape.SetAsEdge( bl, br ); //ground
    staticBody->CreateFixture(&myFixtureDef);
    polygonShape.SetAsEdge( tl, tr);//ceiling
    staticBody->CreateFixture(&myFixtureDef);

            
           

相關推薦

Box2D C++ 教程-射線投射

射線投射經常用來找出部分物理世界當中已經存在的物件。所謂射線就是一條直線,我們可以通過使用Box2D當中提供的方法來檢測是否與某個定製器(fixture)有交點。我們也可以找出與定製器交點的法線。 下面就是上面我提到的方法,如果射線與某個定製器發生碰撞則返回

Box2D C++ 教程-力和衝量

力和衝量(Forces and impulses) 讓物體移動,需要對其施加力或者衝量。可以通過時間的不斷積累對物體施加力的作用來改變物體的運動,然而衝量作用於物體則會立刻改變物體的速度。舉個例子,想象一下現在你的車壞了,你想推車,可以選擇驅動另外一輛車緩慢開向這輛壞了

Linux C/C++教程(二)-- C++對C的拓展

  目錄   一、bool型別關鍵字 二、引用 三、輸入輸出 四、函式引數 五、string類 六、左值 一、bool型別關鍵字 C++在C語言的基礎型別上新增了布林型別(bool),bool可取的值有兩個:true、false,佔

Linux C/C++教程(一)-- 面向過程和麵向物件

目錄   一、面向過程 二、面向物件 一、面向過程 面向過程是一種以過程為中心的程式設計思想。分析問題的解決步驟,通過函式一步步實現,然後順序呼叫函式來執行。主要缺點在於複用性、維護性、拓展性比較差。 二、面向物件 面向物件採用物件(實體)的方式建立抽象

C#教程

C#教程 C# 簡介 C# 環境 C# 程式結構 C# 基本語法 C# 資料型別 C# 型別轉換 C# 變數 C# 常量 C# 運算子 C# 判斷

C# 教程和原始碼

C# 是專業級程式語言。 基於.NET框架,C# (發音: C sharp) 程式語言可以構建寬範圍的企業級應用程式。C#的目標在於提供一個簡單,安全,先進,面向物件,高效能,穩健和永續性的.NET開發語言。 同時它使得開發者可以為更廣泛範圍的客戶提供建立解決方案,包括We

c++教程課後練習題

1:在一個迴圈中讀入兩個int並打印出來,如果遇到’|’就退出程式。 分析: 從鍵盤輸入中讀取兩個數,有可能讀的是非數值型別,所以第一點,非數值型別需要考慮到; 兩個int + 一個字元是題目中需要體現的。那麼讀取出來後的儲存型別就需要提前設計好。因為從鍵

C# 教程(個人感覺不錯,分享給各位朋友)

  These C# tutorials will help you learn the essentials of C#, from the basic to advance level topics. These tutorials are broken down into s

c++教程(二十三: Exceptions)

Exceptions(異常) Exceptions 異常提供了一種方法來對程式中的異常情況(如執行時錯誤)進行響應,將控制傳遞給稱為handlers處理器的特殊函式。 若要捕獲異常,則在異常檢查下放置一部分程式碼。這是通過在 try-block中封裝程式碼部

WINDOWS下CMake編譯執行C/C++教程

背景:此文建立在瞭解ubuntu系統下如何用cmake編譯執行C/C++的基礎上,在Windows系統下原理是一樣的,都需要安裝CMake、安裝gcc/g++編譯環境、安裝好用的文字編輯器VS Code和配置CMakelist.txt,以下依步驟解釋,重要參考連結 安裝CM

C++教程:指向成員函式的指標

成員函式指標是C++最少用到的語法之一,甚至有經驗的C++碼農有時候也會被它搞暈。這是一篇針對於初學者的教程,同時也給有經驗的碼農分享了一些我個人對底層機制的挖掘。在開始之前,讓我們先看一段在第一次看時一定會高呼“我++”的程式碼(說明,這些程式碼都是翻譯君重新手敲的,改正了原文程式碼中的一些不太好的空格、

Quartz.NET c# 教程 - 課程一: 使用 Quartz

課程一: 使用 Quartz 在使用 scheduler 之前, 需要進行初始化。直接使用 ISchedulerFactory 的實現即可。 初始化 scheduler 之後, 就可以啟動, 備用, 或者關閉這個 scheduler。 當然, 關閉 scheduler 之後

Box2D C++ tutorials

Intro:     有個問題經常被提及到:“當一個物體被拋起或者發射到空中時,我要怎麼知道它的執行軌跡     1.它的行進路徑是怎樣的?     2.它可以達到的最大高度     3.物體會以多快的速度達到預想的高度     4.它會碰撞到什麼東西     5.它會反彈

C++教程網 大併發高效能高可用可伸縮性伺服器開發無KEY

01大併發伺服器架構介紹 02大型網站架構演變過程 03poll(一) 04poll(二) 05epoll(一) 06epoll(二) 07muduo介紹 08面向物件程式設計風格 09基於物件程式設計風格 10執行緒封裝 11執行緒特定資料

現代C++教程:高速上手(四)-容器

## 1、線性容器 std::array與std::vector不同的是,array物件的大小是固定的,如果容器大小是固定的,那麼可以優先考慮使用std::array容器。 由於std::vector是自動擴容的,當存入大量的資料後,並且對容器進行了刪除操作,容器並不會自動歸還被刪除元素相應的記憶體,這時候

C#開發Unity遊戲教程之Scene視圖與腳本的使用

ont 展開 支持 查看 提示 microsoft etime font 一個 C#開發Unity遊戲教程之Scene視圖與腳本的使用 Unity中Scene視圖的快捷操作 Scene視圖是開發人員開發遊戲時,操作最頻繁的視圖。由於一旦一個遊戲對象被加入到遊戲的場

C#圖解教程》讀書筆記之四:類和繼承

intern html pan 類中訪問 ted obj 小寫 his new 本篇已收錄至《C#圖解教程》讀書筆記目錄貼,點擊訪問該目錄可獲取更多內容。 一、萬物之宗:Object   (1)除了特殊的Object類,其他所有類都是派生類,即使他們沒有顯示基類定義。   

C++開發人臉性別識別教程(3)——OpenCv配置和ImageWatch插件介紹

下劃線 toc bsp 對話 顯示 調試 詳細 結構 post   OpenCv是C++圖像處理的重要工具。這個人臉性別識別的項目就是借助OpenCv進行開發的。盡管網上已經有了非常多關於OpenCv的配置教程,但出於教程完整性考慮。這裏還是用專門的一篇博客來介紹Ope

C++開發人臉性別識別教程(8)——搭建MFC框架之讀取目錄信息

tail 分享 itemid readdir 文件路徑 alloc tle word 運行   在上一篇博客中我們已經繪制了MFC界面,在這篇博客中我們將加入響應代碼,為MFC框架加入一個最主要的功能:打開一個目錄。   一、加入相關頭文件   這裏

[學習筆記—Objective-C]《Objective-C-基礎教程 第2版》第十一章 屬性

變量名 erl .text nonatomic syn split view 不能 -name 11.1 使用屬性值 @property float rainHandling; //表明此類具有float類型的屬性,其名稱為rainHandling