Billboard在3D场景中不会被裁剪的问题

在cocos2d-x开发的3D游戏中

我们用billboard来做人物的血条,发现有两个问题,导致这个功能无法实现

1.billboard上贴上多个2D的子对象后,子对象之间会出现zorder随机混乱的情况
这个问题我已经在http://www.cocoachina.com/bbs/read.php?tid-293576.html中提过了,但是还是没找到解决方法。

2.当英雄在地图上移动并远离怪物群直到看不到怪物群了,发现drawcall的次数异常的高。
经过追踪发现。按理说再屏幕上看不到怪物的血条了,这些都应该被裁剪掉,但是实际情况是每个怪物的血条依然调用了drawcall,导致了严重的性能问题。

请cocos的团队看一下这两个问题,否者我们的血条就没法做了

或者给出一下其他的替代方案。

关注中…

找到原因了。

2D的sprite只会在default的camera下进行可视化的计算。

再看看有不有其他解决方案吧

bool Renderer::checkVisibility(const Mat4 &transform, const Size &size)
{
auto scene = Director::getInstance()->getRunningScene();
// only cull the default camera. The culling algorithm is valid for default camera.
if (scene && scene->_defaultCamera != Camera::getVisitingCamera())
return true;
--------------------------------------------------------
}

要不你在逻辑层管理一下,超出屏幕外的精灵手动剔除一下(不显示)。

现在的处理方法是创建一个类继承sprite3D

给这个类设置了一个AABB盒

然后重载了visit函数,如果AABB盒不在视窗内,则所有的子节点都不再发送draw的命令

void LolRoleStatusBar::visit(cocos2d::Renderer *renderer, const cocos2d::Mat4 &parentTransform, uint32_t parentFlags)
{
// quick return if not visible. children won’t be drawn.
if (!_visible)
{
return;
}

Mat4 nodeToWorldTransform(getNodeToWorldTransform());
AABB tmpAABB = AABB(mAABB);
tmpAABB.transform(nodeToWorldTransform);
if(!Camera::getVisitingCamera()->isVisibleInFrustum(&tmpAABB))
    return;

}

你好你在怎么解决的

Billboard在3D场景中不会被裁剪的问题。问题解决了么楼主