簡體   English   中英

Box2D + Opengl ES 2.0(XCode,iPhone):有效地更新身體頂點位置

[英]Box2D + Opengl ES 2.0 (XCode, iPhone): Efficiently updating body vertex locations

如果您使用過Box2d,則熟悉設置b2Body->userData屬性,該屬性隨后將用於更新渲染的形狀x,y坐標:

  // 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類來表示每個drawAt ,添加一個drawAt方法,該方法使用OpenGL ES 2.0渲染該drawAt所有所需頂點(帶有屬性),並在其上重drawAt該類坐標正在更改。

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

我意識到這些偏移的管理可能會使添加/刪除緩沖區變得一團糟,但是在我的應用程序中這種情況很少見,我想將渲染性能的每一個降低都擠出管道。

我的問題是:

  1. Opengl ES 2.0是否允許我將一組頂點指定為“形狀”,然后可以通過一個矩陣運算進行平移,還是必須以這種方式顯式地逐個更新頂點?
  2. 我必須創建一個唯一的可更新對象來分配給每個b2Body-> userData,還是有一些更有效的實踐?
  3. 是否最好在其自己的時間軸中更新圖形對象,從關聯的b2Body實例讀取位置或在上面列出的b2Body更新循環中立即更新圖形對象?

我將不勝感激,謝謝。

-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的主體列表。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM