2014-02-28 37 views
0

在我的第一個libgdx 3D遊戲中,我現在從createBox切換到createRect,僅創建可見面(如果牆位於另一面牆的左側,其右面不是可見...)。我創建了4種型號:Libgdx ModelBuilder.createRect僅在一側可見

  1. frontFace
  2. backFace
  3. rightFace
  4. leftFace

他們幾乎繪製他們實際上應該如何。 但是有一個大問題:只有當我看到積極的z-Direction時,側面纔可見。 如果我看着另一面(負面的z-Direction),他們不畫。正面和背面只能畫,如果我看他們在負面x-Direction。 這是否與法線有關?我已將它們設置爲:

normal.x = 0; 
normal.y = 1; 
normal.z = 0; 

這是錯誤嗎?我應該如何設置法線?他們代表什麼?我對燈光的法線貼圖有一些基本的想法,那是一樣的嗎?

重要注意事項:我已禁用背面剔除,但沒有任何區別。查看截錐體剔除已打開。如果需要更多信息,請發表評論,我會盡快添加。謝謝

回答

3

也許不是直接相關,但仍然重要的是要注意:除調試/測試以外,不要使用createRect或createBox。而是將多個形狀組合成單個模型/節點/部分。或者更好的是,儘可能使用建模應用程序。

您沒有指定如何禁用背面剔除。但請記住,不應該在着色器/ rendercontext之外更改opengl狀態(這樣做會導致不可預知的行爲)。 ,該DefaultShader(或默認ModelBatch)配置defaultCullFace成員(見http://libgdx.badlogicgames.com/nightlies/docs/api/com/badlogic/gdx/graphics/g3d/shaders/DefaultShader.Config.html#defaultCullFace)或(不建議使用)靜態DefaultShader#defaultCullFace成員(見http://libgdx.badlogicgames.com/nightlies/docs/api/com/badlogic/gdx/graphics/g3d/shaders/DefaultShader.html#defaultCullFace):要禁用背面消隱您可以利用材料的屬性IntAttribute.CullFacehttps://github.com/libgdx/libgdx/wiki/Material-and-environment#wiki-intattribute見)指定。

面部是正面還是背面是基於頂點繞組。或者換句話說:您提供矩形邊角的順序用於決定哪一面在前面,哪一面在後面。如果您使用其中一種矩形方法,則會注意到參數的後綴爲00,011011。在這裏,當看臉部時,00是左下,01左上,11是右上,10是右下。

對於一個矩形,正常情況是垂直朝向矩形。例如,如果您在XZ平面上有一個矩形,並且它的正面位於頂部,那麼它的法線是X = 0,Y = 1,Z = 0。如果它的正面朝向底部,那麼它的法線是X = 0,Y = -1,Z = 0。同樣,如果您在XY平面上有矩形,則其法線是X = 0,Y = 0,Z = 1或X = 0,Y = 0,Z = -1。請注意,法線不用於臉部剔除,它最常用於照明等。指定不正確/相反的正常將而不是導致臉部被剔除(儘管它可能會導致不正確的/黑色的光照)。

+0

感謝您的回答。我只需要創建1x1x1的塊。那麼我應該如何在沒有createBox/creatRect的情況下構建它們? – Springrbua

+0

@Springrbua使用Blender或其他3D編輯器來達到​​此目的。如果您打算使用Blender,只需添加一個名爲'Cube'的網格並適當調整它的大小。然後以'.obj'格式文件導出並在libGDX中加載這個網格。 – Nolesh

+0

@Nolesh爲什麼這比在運行時創建rects更高效? – Springrbua

0

爲了您的目的,我建議您使用Decal類。貼圖是存在於3D場景中的位圖精靈。 This文章是關於在LibGDX中使用貼花。我希望這是你想要的。

+0

感謝您的回答。爲什麼你認爲在這種情況下使用'Decal'會更好?他們更有效率嗎?實際問題(背面剔除)已經解決,解決方案是角落的順序,這是錯誤的或一些rects。 – Springrbua