設計者は次の3つのファイルを提供しました。
次のように、.objファイルをシーンに正常にロードできます。
SCNView * sceneView = [SCNView new];
sceneView.frame = view.bounds;
[view addSubview:sceneView];
SCNScene * scene = [SCNScene sceneNamed:@"models.scnassets/whatever.obj"];
[sceneView setScene:scene];
私が苦労しているのは、.jpgファイルと.mtlファイルを.objファイルに適用することです。私は次のコードで画像を適用しようとしましたが、愛はありません:
SCNMaterial * material = [SCNMaterial material];
material.diffuse.contents = [UIImage imageNamed:@"image.jpg"];
SCNNode * materialNode = [SCNNode node];
materialNode.geometry.firstMaterial = material;
[scene.rootNode addChildNode:materialNode];
こんにちは@ Johnny.objファイルにテクスチャファイルを適用する方法は複数あります。
素晴らしいカスタマイズでいくつかの.objファイルをロードしたい場合は、Xcodeで.objファイルを開いてテクスチャを適用できます(拡散反射マップ、法線マップなど、環境とライトカメラも)。objファイルは.scnファイルをSCNViewで使用するように変換します。 。
.objまたは.scnファイルの特定のノードにテクスチャを適用したりテクスチャを変更したりする場合は、MetalKit、GLKit、SceneKitを統合する共通のインフラストラクチャを使用して3Dモデルのインポート、エクスポート、操作を提供するモデルI/Oフレームワークを使用できます。 。 SceneKitは、ModelIOアセットのクラスを提供します。例:+(インスタンスタイプ)sceneWithMDLAsset:(MDLAsset *)mdlAsset;(@ Zeeshanが回答したとおり)。
設計者は、3Dモデルファイルを.dae形式でエクスポートできます。 .daeファイルでは、単一のファイルにテクスチャ、カメラ、ライトリファレンスが含まれています。 .objで使用するため、.mtlまたはその他のファイルは必要ありません。 .daeはSCNKitでもサポートされています
金属レンダリングを使用する場合は、NSURLから直接テクスチャをロードできます。
これにより、.mtlファイルを使用しなくても、ある程度の方法が得られました。
//START 3D
NSURL * url = [[NSBundle mainBundle] URLForResource:@"playerModel" withExtension:@"obj"];
MDLAsset * asset = [[MDLAsset alloc] initWithURL:url];
MDLMesh * object = (MDLMesh *)[asset objectAtIndex:0];
MDLScatteringFunction * scatFunction = [MDLScatteringFunction new];
MDLMaterial * material = [[MDLMaterial alloc] initWithName:@"playerMaterial" scatteringFunction:scatFunction];
NSURL * materialURL = [[NSBundle mainBundle] URLForResource:skinFilename withExtension:@"jpg"];
MDLMaterialProperty * baseColour = [MDLMaterialProperty new];
[baseColour setType:MDLMaterialPropertyTypeTexture];
[baseColour setSemantic:MDLMaterialSemanticBaseColor];
[baseColour setURLValue:materialURL];
[material setProperty:baseColour];
for (MDLSubmesh * sub in object.submeshes){
sub.material = material;
}
SCNScene * scene = [SCNScene new];
SCNNode * node = [SCNNode nodeWithMDLObject:object];
SCNVector3 v = SCNVector3Make(100, 200, 0);
[node setPosition:v];
[scene.rootNode addChildNode:node];
SCNView * view = [SCNView new];
view.frame = transferInView.bounds;
view.autoenablesDefaultLighting = true;
view.allowsCameraControl = false;
view.scene = scene;
view.backgroundColor = [UIColor clearColor];
[transferInView addSubview:view];
SCNAction * rotate = [SCNAction rotateByX:0 y:1 z:0 duration:1.0f];
[node runAction:[SCNAction repeatActionForever:rotate]];
SCNVector3 min = SCNVector3Zero;
SCNVector3 max = SCNVector3Zero;
[node getBoundingBoxMin:&min max:&max];
node.pivot = SCNMatrix4MakeTranslation((max.x - min.x) / 2 + min.x, (max.y - min.y) / 2 + min.y, 0);
//END 3D
私は同じ問題に遭遇し、私が見つけた唯一の解決策はこのリンクにあります ここをクリック 。 .mtl情報をロードできたのは、シーンを通じてオブジェクトを作成することでした
let scene = SCNScene(named: "rose.obj")
バンドルにテクスチャを含む.mtlとjpgがあることを確認してください。