2015-10-13 3 views
0

Привет Я пытаюсь иметь 2 спрайта с разными z в мире 3D и камеру, которая вращается вокруг центра экрана и указывает в центре экрана. Даже если спрайты имеют разные z (и zorder, я не знаю, если это необходимо), спрайты всегда визуализируются, в то время как я ожидаю, что второй спрайт будет скрыт от другого ...cocos2dx: Sprite3D rotating, culling error

Это HelloWorld слой INIT

auto sp3d = Sprite3D::create(); 
sp3d->setPosition(visibleSize.width/2, visibleSize.height/2); 
addChild(sp3d); 

auto sprite = Sprite::create("JP9_table.png"); 
auto spritePos = Vec3(0,0,0); 
sprite->setScale(0.3); 
sprite->setPosition3D(spritePos); 
sp3d->addChild(sprite,0); 

auto sprite2 = Sprite::create("JP9_logo_yc.png"); 
auto spritePos2 = Vec3(0,0,10); 
sprite2->setPosition3D(spritePos2); 
sp3d->addChild(sprite2,10); 
sp3d->setCullFace(GL_BACK); 
sp3d->setCullFaceEnabled(true); 
this->setCameraMask((unsigned short)CameraFlag::USER2, true); 

camera = Camera::createPerspective(60, (float)visibleSize.width/visibleSize.height, 1.0, 1000); 
camera->setCameraFlag(CameraFlag::USER2); 
camera->setPosition3D(spritePos + Vec3(-200,0,800)); 
camera->lookAt(spritePos, Vec3(0.0,1.0,0.0)); 
this->addChild(camera); 

this->scheduleUpdate(); 
angle=0; 

и это обновление:

void TestScene::update(float dt) 
{ 
    angle+=0.1; 
    Size visibleSize = Director::getInstance()->getVisibleSize(); 
    Vec2 origin = Director::getInstance()->getVisibleOrigin(); 
    Vec3 spritePos=Vec3(visibleSize.width/2,visibleSize.height/2,0); 

    camera->setPosition3D(Vec3(visibleSize.width/2,visibleSize.height/2,0) + Vec3(800*cos(angle),0,800*sin(angle))); 
    camera->lookAt(spritePos, Vec3(0.0,1.0,0.0)); 

} 

Я судимое что-то проще:

auto sp3d = Sprite3D::create(); 
sp3d->setPosition(visibleSize.width/2, visibleSize.height/2); 
addChild(sp3d); 

auto sprite = Sprite::create("JP9_table.png"); 
auto spritePos = Vec3(0,0,0); 
sprite->setScale(0.3); 
sprite->setPosition3D(spritePos); 
sp3d->addChild(sprite,0); 

auto sprite2 = Sprite::create("JP9_logo_yc.png"); 
auto spritePos2 = Vec3(0,0,10); 
sprite2->setPosition3D(spritePos2); 
sp3d->addChild(sprite2,10); 
sp3d->setCullFace(GL_BACK); 
sp3d->setCullFaceEnabled(true); 

даже если sp3d->runAction(RotateTo::create(20,vec3(0,3000,0))) такой же ошибка. Это ошибка cocos2dx?

спрайт с z = 10 исчезает до того, как он покрыт другим спрайтом ... остаются скрытыми на некоторое время, и когда они должны быть полностью скрыты! Я что-то забыл? спасибо

ответ

0

Возможно, вам стоит это проверить.

_camControlNode = Node::create(); 
_camControlNode->setNormalizedPosition(Vec2(.5,.5)); 
addChild(_camControlNode); 

_camNode = Node::create(); 
_camNode->setPositionZ(Camera::getDefaultCamera()->getPosition3D().z); 
_camControlNode->addChild(_camNode); 

auto sp3d = Sprite3D::create(); 
sp3d->setPosition(s.width/2, s.height/2); 
addChild(sp3d); 

auto lship = Label::create(); 
lship->setString("Ship"); 
lship->setPosition(0, 20); 
sp3d->addChild(lship); 

и

_lis->onTouchMoved = [this](Touch* t, Event* e) { 
     float dx = t->getDelta().x; 
     Vec3 rot = _camControlNode->getRotation3D(); 
     rot.y += dx; 
     _camControlNode->setRotation3D(rot); 

     Vec3 worldPos; 
     _camNode->getNodeToWorldTransform().getTranslation(&worldPos); 

     Camera::getDefaultCamera()->setPosition3D(worldPos); 
     Camera::getDefaultCamera()->lookAt(_camControlNode->getPosition3D()); 
    };