gpt4 book ai didi

Objective-C Scenekit : Import OBJ-File externally and color it

转载 作者:行者123 更新时间:2023-12-04 22:58:10 28 4
gpt4 key购买 nike

我是新来的。这是我的第一个问题。

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

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

[self.mainView.scene.rootnode addChildNode:testScene.rootNode];

这没有用。我也试过:
SCNMaterialProperty *testColor = [SCNMaterialProperty materialPropertyWithContents [UIImage imageNamed:@"color.png"]];
testScene.rootnode.geometry.materials = testcolor;

或者:
SCNMaterial *testColor = [SCNMaterial material];
testColor.diffuse.contesnts = [UIColor redColor];
testScene.rootnode.geometry.firstMaterial = testColor;

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

顺便提一句。我想避免我必须手动从 OBJ-Informations 中构建一个几何图形。所以我尝试通过 SCNScene 来解决这个问题。

最佳答案

主要问题是由 SCNScene 导入不能那样工作。所以正确的解决方案是将 obj.file 导入 SCNNode , 添加 SCNMaterial将所选颜色(或图像)添加到 SCNNode并给 SCNNodeSCNScene .要加载 obj.file,您需要通过 Model IO Framework 导入它。

我会给出一些代码,我是如何让它变得丰富多彩的。

#import <SceneKit/SceneKit.h>
#import <ModelIO/ModelIO.h>
#import <SceneKit/ModelIO.h>

...
@property (nonatomic) SCNView* mainView;

....
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];

或者,您可以通过以下方式添加颜色:
material.diffuse.contents = [UIImage imageNamed:@"farbe.png"];
现在,您可以从外部(从您喜欢的任何选定文件夹)导入任何 obj.file 并为其着色。

感谢 SGlindemann、Cashmash 和 Hal Mueller,他们帮助找到了解决方案。

更新 (29.1.2017)

不知何故,上面的方法不再起作用了。我还没有弄清楚发生了什么变化。但是我制作了另一个代码,可以加载 3D 文件(来自 mainBundle ,而不是外部)。这里我从 SCNNode开始 ViewController.m 调用的类. SCNSceneViewController 中设置.下面是我为 SCNNode 写的代码类(class)。

在开始之前,将 .obj 和 .mtl 文件(都具有相同的名称)放入您的 Xcode 项目中。您不需要将其转换为场景。
#import <ModelIO/ModelIO.h>
#import <SceneKit/ModelIO.h>

...
@property (nonatomic) SCNNode *objectNode;

...
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;

这返回 self必须添加到您的 View 中。
[self.view.scene.rootNode addChildNode:returnedObj];
MDLAsset使用相应的 .mtl 文件和 png 文件加载 .obj 文件。我使用此代码从 MagicaVoxel 加载对象(这会立即导出 obj+mtl+png)。我还没有深入。

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

关于Objective-C Scenekit : Import OBJ-File externally and color it,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35511851/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com