Sprite3D create 成功 无法显示 3.3 rc0 版本

问题描述:

1.使用 3dmax 导出 obj 文件,cc.Sprite3D:create 加载成功但是无法看到该模型。
2.使用 3dmax 导出 fbx 文件,再使用 fbx-conv.exe 转换成 c3t 和 c3b 文件, 分别用这两个文件进行测试,仍然存在同样的问题。

cocos2d-x 版本:3.3 rc0

由于我的陨石图片yungshi_01.png (
yungshi_01.png 并没有拼写错误,因为3dmax 中的材质使用的图片名就拼成了yungshi_01.png)为褐色,为了排除和背景色黑色相近导致看不清的问题,我把背景色调为绿色(cc.LayerColor:create(cc.c4b(0, 255, 0, 255))),问题仍然存在。

为了排除我的lua代码问题,我尝试了其他3d模型文件,可以正常显示,说明我的lua代码没有问题。

3d模型说明:这是一个简单的模型,没有骨骼动画。3dmax 版本为2012

由于我对3d模块不熟悉,暂时没有能力解决这个问题,还希望有人能帮忙解决,谢谢。

相关的文件我将在附件中给出。

代码如下:

local Sprite3DMyTest = {}
Sprite3DMyTest.__index = Sprite3DMyTest

function Sprite3DMyTest.addNewSpriteWithCoords(parent,x,y)
local sprite = cc.Sprite3D:create(“Sprite3DTest/yunshi_01.obj”)
sprite:setScale(3.0)
sprite:setTexture(“Sprite3DTest/yungshi_01.png”)

parent:addChild(sprite)
sprite:setPosition(cc.p(x,y))

end

function Sprite3DMyTest.create()
– local layer = cc.Layer:create()
local layer = cc.LayerColor:create(cc.c4b(0, 255, 0, 255))
Helper.initWithLayer(layer)
Helper.titleLabel:setString(“Testing My Sprite3D”)

Sprite3DMyTest.addNewSpriteWithCoords(layer, size.width / 2, size.height / 2)
return layer

end

没有人回复吗?:9:

LZ可以用工具看看 http://www.cocoachina.com/bbs/read.php?tid-235965-keyword-ģ�Ͳ鿴��.html

谢谢 Believe!奇怪的是今天我把附件下过来,在自己的代码中重新测试居然没有问题了(代码未修改)!不论我怎么折腾也无法重现了。可能是我昨天最后上传的时候不经意的在3dmax做了下修改(忘记修改什么了)。

回复完Believe,未找到原因心里总是忐忑不安,说不定什么时候这个BUG有会重现!我努力回忆3dmax所做的修改,事实上我最后我并没有保存啊,fbx 也没有重新导出,c3t也没有重新导出!那是什么原因呢 – 今天运气好吗:12:

创建Sprite3D的代码确实未修改 – 但是昨天下午我修改了屏幕适配这块代码! 难道和这有关!唯一的线索了,我回退回原来的屏幕适配代码 – 是的!没错!问题重现了!:15:

屏幕适配 代码如下
,true 部分是示例的代码(加载我的3d模型有问题),else部分是我修改后的屏幕适配代码(加载我的3d模型没有问题)。

到此,我确信这是引擎的BUG了,暂时没时间研究,希望有人能解决告诉我,不剩感激!

if true then
local director = cc.Director:getInstance()
local glView = director:getOpenGLView()
if nil == glView then
glView = cc.GLViewImpl:createWithRect(“Lua Tests”, cc.rect(0,0,900,640))
director:setOpenGLView(glView)
end

--turn on display FPS
director:setDisplayStats(true)

--set FPS. the default value is 1.0/60 if you don't call this
director:setAnimationInterval(1.0 / 60)

screenSize = glView:getFrameSize()

local designSize = {width = 480, height = 320}

if screenSize.height > 320 then
    local resourceSize = {width = 960, height = 640}
    cc.Director:getInstance():setContentScaleFactor(resourceSize.height/designSize.height)
end

glView:setDesignResolutionSize(designSize.width, designSize.height, cc.ResolutionPolicy.FIXED_HEIGHT)

else
local director = cc.Director:getInstance()
local glView = director:getOpenGLView()
if nil == glView then
glView = cc.GLViewImpl:createWithRect(“Lua Tests”, cc.rect(0,0,640,960))
director:setOpenGLView(glView)
end

--turn on display FPS
director:setDisplayStats(true)

--set FPS. the default value is 1.0/60 if you don't call this
director:setAnimationInterval(1.0 / 60)

screenSize = glView:getFrameSize()

local designSize = {width = 720, height = 1280}
local resourceSize = {width = 720, height = 1280}

local designRation = designSize.width/designSize.height
local screenRation = screenSize.width/screenSize.height

local policy
if screenRation > designRation then
    policy = cc.ResolutionPolicy.FIXED_HEIGHT
else
    policy = cc.ResolutionPolicy.FIXED_WIDTH
end
glView:setDesignResolutionSize(designSize.width, designSize.height, policy)
cc.Director:getInstance():setContentScaleFactor(resourceSize.height/designSize.height)

end

– local layer = cc.Layer:create()
local layer = cc.LayerColor:create(cc.c4b(0, 255, 0, 255))

Sprite3D 被你的 LayerColor 层遮挡了吧?你把下面的注掉,打开上面的 local layer = cc.Layer:create() 试试。

layer 没有错,是做为sprite3d的父结点。我截了下图,由于我不知道如何在文本中插入图片(汗!),截图上传到附件中了,
注意红色框框圈出来的部分,
可以看到sprite3d 的显示出来的像丝带的纹理。

不用Layercolor也不行?或许你调整一下精灵的深度位置。

是的,不用Layercolor也不行! 修改sprite 的 ZOrder 为10, 问题一样。
lvlong ,你可能没注意到我前面所说的 – 修改lua-test 示例工程中的屏幕适配代码后就可以正常显示了,所以问题应该和 glView:setDesignResolutionSize() cc.Director:getInstance():setContentScaleFactor() 的设置有关系!

哦,要不您加我QQ吧!

今天把你的代码用C++运行了一遍,问题是出在 glview->setDesignResolutionSize(designSize.width, designSize.height, ResolutionPolicy::FIXED_HEIGHT); , 这个函数会导致默认相机重新计算投影;
你应该重新创建一个自己的摄像机,具体方法可以参考cpp-tests 中的 Camera3DTest 例子。修改后就正常了,如下图: