2011-08-30 78 views
1

如果您已經使用Box2d,則您已熟悉設置b2Body->userData屬性,該屬性將用於更新渲染後的形狀x,y座標:Box2D + Opengl ES 2.0(XCode,iPhone):高效更新身體頂點位置

// Physics update: 
    int32 velocityIterations = 6; 
    int32 positionIterations = 2; 
    world->Step(timeDelta, velocityIterations, positionIterations); 
    for (b2Body* b = world->GetBodyList(); b; b = b->GetNext()) { 
    id obj = (id)b->GetUserData(); 
    if ((obj != NULL)) { 
     Shape *s = (MyType*)obj; 
     CGPoint newCentre = CGPointMake(b->GetPosition().x * PTM_RATIO, b->GetPosition().y * PTM_RATIO); 
     [s drawAt:newCentre]; 
    } 
    } 

在概念上,用於該數據流的呈現過程非常簡單:創建一個Shape類來表示每個體中,添加使用OpenGL ES 2.0渲染爲身體所有期望的頂點(具有屬性)一個drawAt方法,以及具有該類在其座標改變時重繪。

但是,我想通過將所有物體的頂點粘貼到單個頂點緩衝區來優化渲染。因此,我打算修改類Shape以在頂點所在位置的緩衝區中包含偏移量,然後可以在drawAt上簡單更新緩衝區中的這些偏移量。

我意識到這些偏移量的管理可能會對緩衝區的添加/移除造成混亂,但是在我的應用程序中這些偏移量並不頻繁,我希望能夠將每一滴渲染性能都擠出管道。

我的問題是:

  1. 不OpenGL ES 2.0的讓我指定一組頂點作爲 「形狀」,然後可以用一個矩陣運算轉換,或 我必須明確地以這種方式逐個更新頂點?
  2. 我必須創建一個獨特的可更新對象來分配給每個 b2Body-> userData,還是有一些更有效的做法?
  3. 在自己的時間軸上更新圖形對象,從關聯的b2Body實例中讀取位置或在上面列出的b2Body更新循環中立即更新圖形對象是更好嗎?

我會很感激一些建議,謝謝。

回答

0

-1。如果在緩衝區爲你的機構建立燈具時給了位置設定的頂點,應該應該能夠做到這一點:

b2Vec2 pos = m_body->GetPosition(); 
float angle = m_body->GetAngle(); 
glPushMatrix(); 
    glTranslatef(pos.x, pos.y, 0); 
    glRotatef(angle * RADTODEG, 0, 0, 1);//OpenGL uses degrees here 
    glDrawArrays(GL_WHATEVER, startIndex, vertexCount); 
glPopMatrix(); 

進行了較深入的討論參見http://www.iforce2d.net/b2dtut/drawing-objects

-2。通常你只想繪製可見的東西。上述方法只有在你確定應該繪製這個特定對象後才能完成。上面問題中的代碼可能會不必要地更新從未繪製的對象的位置。

-3。呃......我想我只是回答了這個問題。我認爲最好有一個你的遊戲對象列表,每個對象都有一個指向b2Body *的指針,代表它們在物理世界中,而不是指向Box2D的主體列表。

+1

感謝您的貢獻,iforce2d。我發佈後不久就自己解決了這個問題,並忘記刪除問題。我最終做了你在3推薦的內容,這很好;我現在在每個Shape類中存儲一個b2Body引用,並更新我的形狀,而不是通過b2Body-> userData進行更新。爲了清楚起見:您發佈的代碼是ES 1.x,而不是ES 2。0這正是我正在討論的。 (2)中提出的觀點是我意識到的,但不完全確定如何處理。現在我關注的是單屏視圖,後來我打算探討是否可以限制b2d更新。 – KomodoDave

+0

這與ES 2.0不兼容。 – ManOx