我尝试使用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);
...
}
所以我看不到我场景中的第二个箭头。我该如何解决这个问题?
答案 0 :(得分:1)
在 Cocos3D 中,资源会被缓存。像往常一样加载相同的POD资源两次将导致CC3PODResourceNode
尝试使用相同的内容。由于任何节点只能有一个父节点,因此第二个节点具有将第一个CC3PODResourceNode
实例的后代移动到第二个实例的效果,使第一个CC3PODResourceNode
实例没有后代。
只需复制要复制的节点,而不是尝试加载同一资源文件的多个副本。复制节点会执行深层复制,也会复制所有后代节点。为了保留内存,不会复制静态且可能非常大的网格顶点内容,并且两个或多个节点可以共享相同的网格内容。
对于您的示例,以下内容可以为您提供所需内容:
resNode = [rezNode copy];
resNode.rotation = CC3VectorMake(90, 0, 0);
[self addChild: resNode];
由于两个节点的scale
和location
属性相同,因此副本将负责在第二个实例中设置它们。