2016-03-07 90 views
2

我非常想在3D物體上創建重複紋理。cocos2d-x在3d中重複紋理

我試着從Maya輸出到.obj。材料文件(.mtl)看起來像這樣:

newmtl lambert10SG 
illum 4 
Kd 0.00 0.00 0.00 
Ka 0.00 0.00 0.00 
Tf 1.00 1.00 1.00 
map_Kd -s 0.1 0.1 grass.jpg 
Ni 1.00 

行 「map_Kd -s 0.1 0.1 grass.jpg」 應說明,紋理重複。然而,這根本不起作用。直到我刪除「-s 0.1 0.1」,紋理纔會顯示。然後它被拉伸。

我試圖導出到.fbx,然後轉換爲.c3b。同樣的結果。紋理被拉伸。

然後我試着創建自己的紋理。我知道在OpenGL中,我必須將紋理座標設置爲> 1以使紋理重複。這些似乎相當於紋理(?)中的maxS和maxT。

這是我的紋理設置:

cocos2d::Image *textImage = new (std::nothrow) cocos2d::Image(); 
textImage->initWithImageFile("grass.jpg"); 

cocos2d::Texture2D *texture = new (std::nothrow)cocos2d::Texture2D(); 
texture->initWithImage(textImage); 

cocos2d::Texture2D::TexParams texParam; 
texParam.wrapS = GL_REPEAT; 
texParam.wrapT = GL_REPEAT; 
texParam.minFilter = GL_LINEAR; 
texParam.magFilter = GL_LINEAR; 

texture->setTexParameters(texParam); 
texture->setMaxS(10.0f); 
texture->setMaxT(10.0f); 

sprite->getMesh()->setTexture(texture); 

紋理仍然拉伸。

從搜索互聯網看來,我可以使用setTextureRect函數在Cocos中的2D精靈上設置紋理座標。然而,這似乎並不存在爲sprite3D。

任何想法將非常感激!

回答

0

更新:

我設法通過手動編輯.obj文件來獲得紋理平鋪。

顯然CCObjLoader不明白的材料文件(.mtl)行:

map_Kd -s 0.1 0.1 grass.jpg 

刪除 「-s 0.1 0.1」,使得裝載機認識紋理(仍伸雖然)。

之後,我不得不手動更改.obj文件中的所有vt座標,通過乘以10.仍然紋理不重複,直到我將紋理參數更改爲GL_REPEAT而不是GL_CLAMP_TO_EDGE。

cocos2d::Texture2D::TexParams texParam; 
texParam.wrapS = GL_REPEAT; 
texParam.wrapT = GL_REPEAT; 
texParam.minFilter = GL_LINEAR; 
texParam.magFilter = GL_LINEAR; 

sprite->getMesh()->getTexture()->setTexParameters(texParam); 

這不是我的問題的解決方案,因爲我需要應用程序來識別紋理何時應該自動重複。

我還沒有解釋在紋理座標保存在cocos2d結構中的地方,因此在加載精靈之後還沒有能夠改變它們。一個解決方案可能是修復objLoader,但是這不太容易進行cocos更新。或者也許做一個小的.obj文件修復程序。這些似乎都不是理想的解決方案...