我尝试使用Cocos3D
,我需要在相机前面的球体上显示几个3D对象。下面是我的代码:
@interface cocos3d_testScene : CC3Scene {
CC3ResourceNode* rezNode;
CC3ResourceNode* resNode;
}
- (void) onOpen {
...
rezNode = [CC3PODResourceNode nodeFromFile: @"arrow.pod"];
rezNode.scale = CC3VectorMake(0.03, 0.03, 0.03);
rezNode.rotation = CC3VectorMake(90, 90, 0);
[self addChild: rezNode];
rezNode.location = CC3VectorMake(0, 0, -1.9);
resNode = [CC3PODResourceNode nodeFromFile: @"arrow.pod"];
resNode.scale = CC3VectorMake(0.03, 0.03, 0.03);
resNode.rotation = CC3VectorMake(90, 0, 0);
[self addChild:resNode];
resNode.location = CC3VectorMake(0, 0, -1.9);
...
}
所以我在场景中看不到第二个箭头。我怎么解决这个问题?
在Cocos3D中,资源被缓存。正如您所做的那样,两次加载相同的POD资源将导致两个CC3PODResourceNode
尝试使用相同的内容。由于任何节点只能有一个父节点,第二次加载的效果是将第一个CC3PODResourceNode
实例的后代移动到第二个实例,使第一个CC3PODResourceNode
实例没有后代。
不需要尝试加载相同资源文件的多个副本,只需复制想要复制的节点。复制节点执行深度复制,同时复制所有后代节点。为了节省内存,网格顶点内容是静态的,可能相当大,不被复制,两个或多个节点可以共享相同的网格内容。
对于你的例子,下面应该可以得到你想要的:
resNode = [rezNode copy];
resNode.rotation = CC3VectorMake(90, 0, 0);
[self addChild: resNode];
由于两个节点的scale
和location
属性是相同的,复制将负责在第二个实例中设置它们。