首頁 資料庫 mysql教程 Box2D的Edge Shape的碰撞处理

Box2D的Edge Shape的碰撞处理

Jun 07, 2016 pm 03:13 PM
edge 處理

有时候两个body碰撞时需要精确到某条边,所以在创建body的时候需要创建multiFixture,也就是多个fixture的组合。早期Box2D版本中Polygon Shape有setAsEdge方法设置每条边的fixture,v2.2.1之后只有setAsBox方法了。 方法一:可以在每条边的位置上加上一个Edg

        有时候两个body碰撞时需要精确到某条边,所以在创建body的时候需要创建multiFixture,也就是多个fixture的组合。早期Box2D版本中Polygon Shape有setAsEdge方法设置每条边的fixture,v2.2.1之后只有setAsBox方法了。

        方法一:可以在每条边的位置上加上一个Edge Shape,然后再body中加入这个边的fixture并保存起来,碰撞的时候就能判断是碰到哪条边了。

        方法二:直接用body的createFixture(edgeShape,density)方法,直接创建一条edge的fixture,因为一般边不需要其他属性。默认边有摩擦力和弹力。

        边也是以body中点为原点,所以边的起点和终点要用宽和高的一半来算。

       这样添加后的碰撞种类(以player站在platform)上为例,可分为:

        1. player的polygonShape和platform的topEdgeShape碰撞。

        2. player的bottomEdgeShape和platform的polygonShape碰撞。

        3. player的polygonShape和platform的polygonShape碰撞。

        4. player的bottomEdgeShape和platform的topEdgeShape不会发生碰撞,因为他们都是Edge类型。

        edgeShape的长度比polygonShape相应边的长度短一点,这样分别在判断左右两边和上下两边是否发生碰撞时,不会相互影响到。当rightEdge碰撞时,bottomEdge不会发生碰撞;当bottomEdge碰撞时,rightEdge也不会发生碰撞。

        如果edgeShape的长度和polygonShape相应边的长度一样的话,当rightEdge碰撞时,bottomEdge的右端也会顶到墙上,发生碰撞,从而产生逻辑错误。比如:设定bottomShape发生碰撞时player的状态是isJump=NO,bottomEdge没有碰撞时isJump=YES。当player跳起并碰到墙壁时,isJump应该是YES状态,但bottomEdge检查到了碰撞,将isJump设为NO,这样player的其他行为和动作会发生错误。

        或者把矩形polygonShape的直角顶点“切掉”,变成八边形。

如下图所示:

Box2D的Edge Shape的碰撞处理

1.

    //DELTA_LENGTH = 0.5   
    //fixture1 with polygon shape
    b2PolygonShape rectShape;
    rectShape.SetAsBox(size.x/2/PTM_RATIO, size.y/2/PTM_RATIO);
    
    b2FixtureDef fixtureDef1;
    p_body->CreateFixture(&fixtureDef1);
    
    //fixture2 with edge shape
    b2EdgeShape edgeShape;
    edgeShape.Set(b2Vec2((-size.x/2 + DELTA_LENGTH)/PTM_RATIO, (-size.y/2)/PTM_RATIO), 
                  b2Vec2((size.x/2 - DELTA_LENGTH)/PTM_RATIO, (s-size.y/2)/PTM_RATIO));
                        
    b2FixtureDef fixtureDef2;
    fixtureDef2.shape = &edgeShape;
    p_bottomFixture = p_body->CreateFixture(&fixtureDef2);
登入後複製

2. 

b2EdgeShape edgeShape;
    edgeShape.Set(b2Vec2((-size.x/2 + DELTA_LENGTH)/PTM_RATIO, (-size.y/2)/PTM_RATIO), 
                  b2Vec2((size.x/2 - DELTA_LENGTH)/PTM_RATIO, (-size.y/2)/PTM_RATIO));

    p_bottomFixture = p_body->CreateFixture(&edgeShape, 0);
登入後複製

3 polygonShape必须是凸多边形,顶点按照逆时针方向依次给出

b2PolygonShape polygonShape;
    b2Vec2 vec[] = {b2Vec2(-size.x/2/PTM_RATIO, -size.y/2/PTM_RATIO), 
                    b2Vec2(size.x/2/PTM_RATIO, -size.y/2/PTM_RATIO), 
                    b2Vec2(size.x/2/PTM_RATIO, -size.y/4/PTM_RATIO), 
                    b2Vec2(size.x/4/PTM_RATIO, size.y/2/PTM_RATIO), 
                    b2Vec2(-size.x/4/PTM_RATIO, size.y/2/PTM_RATIO), 
                    b2Vec2(-size.x/2/PTM_RATIO, -size.y/4/PTM_RATIO)};
    polygonShape.Set(vec, 6);
    b2FixtureDef fixtureDef1;
    fixtureDef1.shape = &polygonShape;
    fixtureDef1.density = dens;
    fixtureDef1.friction = f;
    fixtureDef1.restitution = rest;
    p_polygonFixture = p_body->CreateFixture(&fixtureDef1);
登入後複製


本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

Edge瀏覽器如何啟用自動密碼儲存功能? Edge瀏覽器如何啟用自動密碼儲存功能? Jan 02, 2024 pm 12:28 PM

很多時候我們在使用電腦時都會選擇Edge來查詢自己想要的信息,並且在登錄一些網站的時候是需要帳號密碼的,不過每次都要輸入就比較麻煩,這時我們要如何操作才能夠使Edge自動儲存密碼呢?不清楚的小夥伴就一起來看看吧。 Edge自動儲存密碼的方法1、開啟軟體,點選右上角的三個點「...」按鈕,選擇下方選項清單中的「設定」。 2、在開啟的視窗介面中,點選左側中的「個人資料」選項。 3、然後找到右側的“讓我選擇儲存密碼”,將

如何在微軟Edge中啟用超級拖放模式 如何在微軟Edge中啟用超級拖放模式 Mar 18, 2024 am 09:40 AM

MicrosoftEdge的拖放功能讓您可以輕鬆開啟網頁上的連結或文本,這種功能既實用又省時。要使用此功能,只需將連結或文字拖放到網頁的任意位置即可。本文將向您介紹如何在MicrosoftEdge中啟用或停用超級拖放模式。什麼是MicrosoftEdge中的超級拖放模式?微軟Edge引進了一項名為「超級拖放」的新功能,用戶只需簡單地拖放連結即可在新分頁中快速開啟。只需將連結拖曳到Edge瀏覽器視窗的任何位置即可輕鬆實現。 Edge會自動在一個新的選項卡中載入該連結。此外,用戶還可以根據個人偏

WIN10服務主機太佔cpu的處理操作過程 WIN10服務主機太佔cpu的處理操作過程 Mar 27, 2024 pm 02:41 PM

1.首先我們右鍵點選任務列空白處,選擇【任務管理器】選項,或右鍵開始徽標,然後再選擇【任務管理器】選項。 2.在開啟的任務管理器介面,我們點選最右邊的【服務】選項卡。 3.在開啟的【服務】選項卡,點選下方的【開啟服務】選項。 4.在開啟的【服務】窗口,右鍵點選【InternetConnectionSharing(ICS)】服務,然後選擇【屬性】選項。 5.在開啟的屬性窗口,將【開啟方式】修改為【禁用】,點選【應用程式】後點選【確定】。 6.點選開始徽標,然後點選關機按鈕,選擇【重啟】,完成電腦重啟就行了。

解決edge瀏覽器在b站全螢幕模式下的卡頓問題 解決edge瀏覽器在b站全螢幕模式下的卡頓問題 Jan 12, 2024 pm 11:00 PM

近期不少朋友在使用edge瀏覽器全螢幕觀看b站影片的時候都遇到了卡頓的狀況體驗很不好,那該怎麼解決呢?下面就一起來看看詳細的解決方法吧。 edge瀏覽器b站全螢幕卡頓:1、開啟瀏覽器輸入網址about:flags。 2、進入開發者設定。 3.點擊上方「將所有標誌重設為預設」。 4.下滑到底,勾選「啟用實驗性JavaScript功能」即可解決。

如何降低Edge瀏覽器的記憶體佔用? Edge記憶體佔用問題的解決方法 如何降低Edge瀏覽器的記憶體佔用? Edge記憶體佔用問題的解決方法 Jan 05, 2024 pm 05:54 PM

Edge瀏覽器記憶體佔用高怎麼辦?小編發現現在有非常多的小夥伴都喜歡使用微軟的Edge瀏覽器,因為其不僅簡潔,還能夠安裝各種瀏覽器插件,不過最近有部分小伙伴在使用Edge的時候發現其cpu佔用非常高,也就是佔用記憶體過於高,這時候要如何處理這種情況呢?下面就跟小編一起來看看解決方法吧。 Edge記憶體佔用高的解決方法1、關閉標籤進入edge瀏覽器點擊右上角三個點。在工作列中選擇“擴展”。將不需要使用的插件關閉或卸載即可。 2、更新MicrosoftEdge瀏覽器請確保您的電腦上已經安裝

如何處理Microsoft尊重您隱私的edge彈窗 如何處理Microsoft尊重您隱私的edge彈窗 Jan 31, 2024 pm 02:14 PM

edge彈出Microsoft尊重您的隱私怎麼辦?最近有使用者回饋自己使用的edge瀏覽器經常彈窗Microsoft尊重您的隱私,即使點擊了我接受,下次打開瀏覽器還是會出現。那麼到底要怎麼關閉這個煩人的彈跳窗呢?出現這個問題應該是edge瀏覽器沒有接受msn.cn網站的cookie,下面小編就帶你去看看解決edge彈出Microsoft尊重您的隱私的方法,試下有沒有用。解決edge彈出Microsoft尊重您的隱私的方法開啟Edge瀏覽器的設定:隱私、搜尋和服務,找到清除瀏覽資料這一項,點擊選擇每次關

Edge瀏覽器相容性怎麼設定? Edge瀏覽器相容模式開啟方法教學 Edge瀏覽器相容性怎麼設定? Edge瀏覽器相容模式開啟方法教學 Jan 07, 2024 pm 01:50 PM

Edge瀏覽器相容性怎麼設定?大部分的使用者都使用Edge瀏覽器為預設瀏覽器,當我們在使用Edge瀏覽器時要使用到Edge瀏覽器的相容模式進行網頁瀏覽時,應該如何設定呢?不清楚的小夥伴快跟著小編一起來看看具體的設定方法吧。 Edge瀏覽器相容性設定方式:方法一:1、點選開始選單,選擇Edge瀏覽器,如下圖所示。 2.開啟Edge瀏覽器之後,點選右上方的三點圖標,如下圖所示。為了幫助還沒過關的玩家們,讓我們一起來了解具體的解謎方法吧。 3.Edge瀏覽器設定相容模式主要透過ie,點擊三點圖標,選擇「使

如何在Edge中自訂右鍵選單 如何在Edge中自訂右鍵選單 Jan 13, 2024 pm 11:57 PM

Edge如何設定右鍵選單? Edge瀏覽器是微軟所推出的一款瀏覽器軟體,也是有不少小夥伴都在使用,而我們在使用過程中也是會常用到右鍵選單的功能,不過還是有不少小夥伴不清楚其右鍵要如何設置,那麼下面就和小編一起看看Edge設定右鍵選單的方法,有需要的使用者可不要錯過。 Edge設定右鍵選單的方法方法一首先,開啟Edge瀏覽器,點選右上角的「...」按鈕。 2、接著打開下面的“設定”,如圖所示。接下來,在遊戲介面的上方搜尋欄中輸入"右鍵",點擊搜尋按鈕。這樣你就能找到右鍵選單的設定選項了。方

See all articles