2013-09-13 4 views
1

Я новичок в Cocos3D, и у меня есть два вопроса относительно частей 3D-модели.Могу ли я получить доступ к частям файла .pod?

Как я понял, файл .POD состоит из нескольких частей. В моем примере у меня есть 3D-автомобиль, в котором есть части: - колесо - шина - класс (и т. Д.), И у этих частей есть подмаски. Я вижу это, когда открываю файл pod с PVRShaman.

Теперь мои вопросы:

  1. Возможно ли для меня, чтобы иметь доступ к этим частям? Например. Я хочу изменить цвет колеса. Могу ли я сделать это программно?

  2. Когда я нажимаю на часть, я хочу знать, на какой части я постучал. Например. Я хочу нажать на колесо, и я знаю, что было выбрано колесо. Как я могу это сделать?

спасибо!

Обновление: после второго предложения, мой метод выглядит следующим образом:

-(void) nodeSelected: (CC3Node*) aNode byTouchEvent: (uint) touchType at: (CGPoint) touchPoint { 
    NSLog(@"Node selected: %@", aNode.name); 
    CC3Ray touchRay = [camera unprojectPoint: touchPoint]; 
    CC3NodePuncturingVisitor* puncturedNodes = [self nodesIntersectedByGlobalRay: touchRay]; 

    // The reported touched node may be a parent. We want to find the descendant node that 
    // was actually pierced by the touch ray, so that we can attached a descriptor to it. 
    CC3Node* localNode = puncturedNodes.closestPuncturedNode; 

    NSLog(@"Node local: %@", localNode.name); 
} 

ответ

1

Да, это, безусловно, возможно.

Допустим, у вас есть файл POD автомобиля с дверьми, шинами, рулевым колесом и т. Д.
Если вы хотите получить доступ к шинам автомобиля в cocos3d, вам понадобится название узла шины, это должно были установлены в вашем 3D-редакторе (майя, блендер и т. д.).

Допустим, вы использовали майя, и что вы установили все четыре названия узлов шины для:
L_back_tire, L_front_tire, R_back_tire, R_front_tire.

Тогда вы могли бы сделать это

//load car and all the child nodes of the car 
CC3PODResourceNode *car = [CC3PODResourceNode nodeFromFile:@"Car.pod"]; 
[self addChild:car]; 

//the car and all its child node (tires,doors,etc.) have been loaded into the scene 
//so this is how you would fetch the left tire 
CC3Node *leftTire = [car getNodeNamed:@"L_back_tire"]; 

//do more stuff with that tire her 
+0

Ницца, это помогло! Но теперь моя проблема заключается в том, что если я коснусь автомобиля (например, на колесе), в методе '- (void) nodeSelected: (CC3Node *) aNode byTouchEvent: (uint) touchType в: (CGPoint) touchPoint' моего Сцена, aNode - «car.pod», а не «L_back_tire». Как узнать, на какой части я постучал? Но спасибо за первое! – tralala

+0

Я теперь установил каждый сумереш как осязаемый. Это очень много усилий, но единственное, что я мог сделать. Поэтому я использовал свой первый ответ, чтобы получить все подмастеры, и после этого каждый из них должен быть осязаемым. – tralala

0
CC3Ray touchRay = [self.activeCamera unprojectPoint: touchPoint]; 
CC3NodePuncturingVisitor* puncturedNodes = [self nodesIntersectedByGlobalRay: touchRay]; 

// The reported touched node may be a parent. We want to find the descendant node that 
// was actually pierced by the touch ray, so that we can attached a descriptor to it. 
CC3Node* localNode = puncturedNodes.closestPuncturedNode;` 

В localNode будет узел, который был ближе всего к касанию.

Я получил это от проекта cocos3d DemoMashUp.

Я рекомендую вам открыть CC3DemoMashUpScene.m из Cocos3dDemoMashUp и посмотреть на метод -(void) markTouchPoint: (CGPoint) touchPoint on: (CC3Node*) aNode.
Это в нижней части файла.

+0

Спасибо за этот ответ! Но unfortunalety localNode всегда для меня всегда :( – tralala

+0

Всегда ли это, когда вы касаетесь больших родительских объектов ?, а также этот код должен быть в вашем '- (void) nodeSelected: (CC3Node *) aNode byTouchEvent: (uint) touchType at: (CGPoint) touchPoint' – zamfir

+0

Да, к сожалению, он всегда равен нулю :(и у меня есть это в этом методе, как вы видите сейчас в обновленном вопросе. aNode не ноль, но это только родительская сетка, и я хочу для обнаружения детей. – tralala