Не могу добавить несколько ресурсов стручка на сцену

Я пытаюсь использовать Cocos3D и мне нужно показать несколько трехмерных объектов, размещенных на сфере перед камерой. Итак, вот мой код:

@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);
...
}

Так что я не вижу вторую стрелу на моей сцене. Как я могу решить это?

1 ответ

Решение

В Cocos3D ресурсы кэшируются. Загрузка одного и того же ресурса POD дважды, как вы делаете, приведет к обоим CC3PODResourceNode пытаясь использовать тот же контент. Поскольку любой узел может иметь только одного родителя, вторая загрузка приводит к перемещению потомков первого CC3PODResourceNode экземпляр ко второму экземпляру, оставляя первый CC3PODResourceNode экземпляр без потомков.

Вместо того, чтобы пытаться загрузить несколько копий одного и того же файла ресурсов, просто скопируйте узлы, которые вы хотите дублировать. Копирование узла выполняет глубокое копирование, а также копирование всех узлов-потомков. Чтобы сохранить память, содержимое вершин сетки, которое является статическим и может быть довольно большим, не копируется, и два или более узла могут совместно использовать одно и то же содержимое сетки.

Для вашего примера следующее должно дать вам то, что вы хотите:

    resNode = [rezNode copy];
    resNode.rotation = CC3VectorMake(90, 0, 0);
    [self addChild: resNode];

Так как scale а также location свойства обоих узлов одинаковы, копия позаботится об их установке во втором экземпляре.

Другие вопросы по тегам