Objective-C Scenekit:从外部导入OBJ-File并为其着色

Ale*_*ger 4 colors object scenekit

我是新来的.我的第一个问题出现了.

我用SceneKit构建了一个对象加载器.我得到了路径,对象可用,但我不知道如何为显示的对象着色.

ScnScene *testScene = [SCNScene sceneWithURL:url options:nil error:NULL];
testScene.background.contents = [UIImage imageWithName:@"color.png"];

[self.mainView.scene.rootnode addChildNode:testScene.rootNode];
Run Code Online (Sandbox Code Playgroud)

这没用.我也尝试过:

SCNMaterialProperty *testColor = [SCNMaterialProperty materialPropertyWithContents [UIImage imageNamed:@"color.png"]];
testScene.rootnode.geometry.materials = testcolor;
Run Code Online (Sandbox Code Playgroud)

要么:

SCNMaterial *testColor = [SCNMaterial material];
testColor.diffuse.contesnts = [UIColor redColor];
testScene.rootnode.geometry.firstMaterial = testColor;
Run Code Online (Sandbox Code Playgroud)

什么都行不通.当我启动应用程序时,会显示每个对象.到目前为止,OBJ-Loader工作得非常好.但一切仍然是灰色的.我完全不知道如何为显示的对象着色.有没有人给我提示/想法/解决方案?

顺便说一句.我想避免我必须手动从OBJ信息构建几何.所以我试着通过SCNScene来解决这个问题.

Ale*_*ger 7

主要问题是a的导入SCNScene不起作用.因此,正确的解决方案是将obj.file导入到SCNNode,添加一个SCNMaterial与所选择的颜色(或图像)的SCNNode和给出SCNNodeSCNScene.要加载obj.file,您需要通过Model IO Framework导入它.

我会给出一些代码,告诉我如何丰富多彩.

#import <SceneKit/SceneKit.h>
#import <ModelIO/ModelIO.h>
#import <SceneKit/ModelIO.h>
Run Code Online (Sandbox Code Playgroud)

...

@property (nonatomic) SCNView* mainView;
Run Code Online (Sandbox Code Playgroud)

....

MDLAsset *asset = [[MDLAsset alloc] initWithURL:url];     
SCNScene *scene = [SCNScene scene];
SCNNode *node = [SCNNode nodeWithMDLObject:[asset objectAtIndex:0]];

SCNMaterial *material = [SCNMaterial material];
material.diffuse.contents = [UIColor colorWithHue:0 saturation:0.1 brightness:0.5 alpha:1];
node.geometry.firstMaterial = material;

[scene.rootNode addChildNode:node];
[self.mainView.scene.rootNode addChildNode:scene.rootNode];
Run Code Online (Sandbox Code Playgroud)

或者,您可以通过以下方式添加颜色:

material.diffuse.contents = [UIImage imageNamed:@"farbe.png"];

现在,您可以从外部导入任何obj.file(从您喜欢的任何选定文件夹中)并为其着色.

感谢SGlindemann,cashmash和Hal Mueller,他们帮助找到了解决方案.


更新(29.1.2017)

不知怎的,上面的方式不再起作用了.我还没弄清楚发生了什么变化.但我制作了另一个代码,可以加载3D文件(来自mainBundle,而不是外部).在这里,我从一个SCNNode被调用的类开始ViewController.m.该SCNScene是在设置ViewController.下面是我为该SCNNode课程编写的代码.

在开始之前,将.obj和.mtl文件(都具有相同名称)放入Xcode项目中.您无需将其转换为场景.

#import <ModelIO/ModelIO.h>
#import <SceneKit/ModelIO.h>
Run Code Online (Sandbox Code Playgroud)

...

@property (nonatomic) SCNNode *objectNode;
Run Code Online (Sandbox Code Playgroud)

...

NSString* path = [[NSBundle mainBundle]
            pathForResource:[NSString stringWithFormat:@"name of the obj.file"]
            ofType:@"obj"];
NSURL *url = [NSURL fileURLWithPath:path];
MDLAsset *asset = [[MDLAsset alloc]initWithURL:url];

// Create the Block
self.objectNode = [SCNNode nodeWithMDLObject:[asset objectAtIndex:0]];


[self addChildNode: self.objectNode];

return self;
Run Code Online (Sandbox Code Playgroud)

返回的self内容必须添加到您的视图中.

[self.view.scene.rootNode addChildNode:returnedObj];
Run Code Online (Sandbox Code Playgroud)

MDLAsset加载的obj文件与相应的.mtl文件和PNG-文件.我使用此代码从MagicaVoxel加载对象(这会立即导出obj + mtl + png).我还没有深入研究它.

我没有尝试使用外部加载此代码或手动输入颜色SCNMaterial.所以没有声明这是否有效.我没试过.