关掉深度测试实现3d效果后,andoird效果出错

最近做的项目,我实现了一个3d可旋转的游戏大厅界面。在win32和在ios上均没有问题,在android上初始化没问题,后台到前台时效果出错。

实现代码如下:

...

//创建一个sprite

CCSprite* pImage;

//初始化精灵的代码

...

//设置3d camera的视角

 getCameraAngle(pImage,0.5f,0,0,0,0,0,&i,&j,&k);
 pImage->getCamera()->setEyeXYZ(i,j,k);

...

//设置3d camera视角的函数。其实就是用CCOrbitCamera的action写的。由于直接调用action无法直接初始化3d效果,所以封装了一下。不知道这个封装有没有问题,请指正

 void getCameraAngle(CCNode* actnode,float radius, float deltaRadius, float angleZ, float deltaAngleZ, float angleX, float deltaAngleX,float* i,float * j,float* k)
{
 float fRadDeltaZ = (CGFloat)CC_DEGREES_TO_RADIANS(deltaAngleZ);
 float fRadDeltaX = (CGFloat)CC_DEGREES_TO_RADIANS(deltaAngleX);

 float newRadius, zenith, azimuth;
 float ex, ey, ez, cx, cy, cz, x, y, z;
 float r; // radius
 float s;

 CCCamera* pCamera = actnode->getCamera();
 pCamera->getEyeXYZ(&ex, &ey, &ez);
 pCamera->getCenterXYZ(&cx, &cy, &cz);

 x = ex-cx;
 y = ey-cy;
 z = ez-cz;

 r = sqrtf( powf(x,2) + powf(y,2) + powf(z,2));
 s = sqrtf( powf(x,2) + powf(y,2));
 if( s == 0.0f )
 s = FLT_EPSILON;
 if(r==0.0f)
 r = FLT_EPSILON;

 zenith = acosf( z/r);
 if( x < 0 )
 azimuth= (CGFloat)M_PI - asinf(y/s);
 else
 azimuth = asinf(y/s);

 newRadius = r / CCCamera::getZEye(); 

if( isnan(radius) )
 radius = newRadius;
 if( isnan(angleZ) )
 angleZ= (CGFloat)CC_RADIANS_TO_DEGREES(zenith);
 if( isnan(angleX) )
 angleX = (CGFloat)CC_RADIANS_TO_DEGREES(azimuth);

 float fRadZ = (CGFloat)CC_DEGREES_TO_RADIANS(angleZ);
 float fRadX = (CGFloat)CC_DEGREES_TO_RADIANS(angleX);

 float rr = radius * CCCamera::getZEye();
 float za = fRadZ + fRadDeltaZ ;
 float xa = fRadX + fRadDeltaX ;

 * i = sinf(za) * cosf(xa) * rr;
 * j = sinf(za) * sinf(xa) * rr ;
 * k = cosf(za) * rr ;
}...//AppDelegate.cpp里在applicationDidFinishLaunching函数里初始化场景前调用pDirector->setDepthTest(false);...

实现效果如下:

win32、ios以及android未切到后台前效果:
277

android切入后台,再到前台效果:
278

cocos2d-x版本:1.0.1-0.12.0

求王哲老大以及各位了解这块的大拿们帮忙解答。谢谢{:soso_e183:}

帮顶,坐等王哲大大解答啊。

— Begin quote from ____

子龙山人 发表于 2012-6-19 12:56 url

帮顶,坐等王哲大大解答啊。

— End quote

{:soso_e183:}

你从后台再推前台时,再调用一下
pDirector->setDepthTest(false)
试试。

— Begin quote from ____

minggo 发表于 2012-6-19 17:34 url

你从后台再推前台时,再调用一下
pDirector->setDepthTest(false)
试试。

— End quote

试过没用.open gl es的很多方法我都试了都不行,但是我不敢肯定不是open gl es的问题

各种尝试,没结果。谁敢解答下。。。

单纯从代码风格的角度看 有很多地方让人不放心。:L

— Begin quote from ____

chenshun 发表于 2012-6-21 09:25 url

单纯从代码风格的角度看 有很多地方让人不放心。

— End quote

求高人指点

你是在什么时候调用的啊?
捕鱼2.0也用到了类似的功能,也是在推前台时重新关闭深度测试。
在AppDelegate::applicationWillEnterForeground() 里重新关闭。

— Begin quote from ____

minggo 发表于 2012-6-21 12:05 url

你是在什么时候调用的啊?
捕鱼2.0也用到了类似的功能,也是在推前台时重新关闭深度测试。
在AppDelegate:: …

— End quote

我想知道是什么原因,什么问题。您能告诉我么?

换了个思路,问题解决了。我的解决方法:
首先在AppDelegate里调用的:

CCDirector::sharedDirector()->setDepthTest(false);

这句去掉。
在我加3d效果的类里,重写visit函数:

void visit()
{
	CCDirector::sharedDirector()->setDepthTest(false);
	CCNode::visit();
	CCDirector::sharedDirector()->setDepthTest(true);
}

但是根本原因没找到,还希望哪位大拿能看出问题的帮忙告我下,谢谢。

帮顶,坐等王哲大大解答啊。

你从后台再推前台时,再调用一下
pDirector->setDepthTest(false)
试试。

单纯从代码风格的角度看 有很多地方让人不放心。:L

你是在什么时候调用的啊?
捕鱼2.0也用到了类似的功能,也是在推前台时重新关闭深度测试。
在AppDelegate::applicationWillEnterForeground() 里重新关闭。