我是Cocos3D的新手,我有两个关于3D模型部分的问题。
据我了解,.POD文件由几个部分组成。在我的示例中,我有一辆 3D 汽车,其中包含以下零件:- 车轮 - 轮胎 - 类(等),这些零件具有子网格。当我使用 PVRShaman 打开 pod 文件时,我看到了这一点。
现在我的问题:
-
我是否可以访问这些部件? 例如,我想更改车轮的颜色。我可以通过编程方式执行此操作吗?
-
当我点击一个零件时,我想知道,我点击了哪个部分。 例如,我想点击滚轮,我知道,轮子被选中了。我该怎么做?
谢谢!
更新:在第二个提案之后,我的方法如下所示:
-(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);
}
是的,这绝对是可能的。
假设您有一个带有车门、轮胎、方向盘等的汽车的 POD 文件。
如果您想在 cocos3d 中访问汽车的轮胎,您将需要轮胎节点的名称,这应该已在 3d 编辑器(Maya、搅拌机等)中设置。
假设您使用了 Maya,并且已将所有四个轮胎节点名称设置为:
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
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项目中得到了这个。
我建议您从Cocos3dDemoMashUp中打开CC3DemoMashUpScene.m
,然后-(void) markTouchPoint: (CGPoint) touchPoint on: (CC3Node*) aNode
查看方法。
它位于文件的底部。