web-dev-qa-db-ja.com

SceneKitの.objファイルに.jpgおよび.mtlファイルを適用します

設計者は次の3つのファイルを提供しました。

  • 画像.jpg
  • 何か.mtl
  • 何でも。obj

次のように、.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];
8
Johnny Rockex

こんにちは@ Johnny.objファイルにテクスチャファイルを適用する方法は複数あります。

  1. 素晴らしいカスタマイズでいくつかの.objファイルをロードしたい場合は、Xcodeで.objファイルを開いてテクスチャを適用できます(拡散反射マップ、法線マップなど、環境とライトカメラも)。objファイルは.scnファイルをSCNViewで使用するように変換します。 。

  2. .objまたは.scnファイルの特定のノードにテクスチャを適用したりテクスチャを変更したりする場合は、MetalKit、GLKit、SceneKitを統合する共通のインフラストラクチャを使用して3Dモデルのインポート、エクスポート、操作を提供するモデルI/Oフレームワークを使用できます。 。 SceneKitは、ModelIOアセットのクラスを提供します。例:+(インスタンスタイプ)sceneWithMDLAsset:(MDLAsset *)mdlAsset;(@ Zeeshanが回答したとおり)。

  3. 設計者は、3Dモデルファイルを.dae形式でエクスポートできます。 .daeファイルでは、単一のファイルにテクスチャ、カメラ、ライトリファレンスが含まれています。 .objで使用するため、.mtlまたはその他のファイルは必要ありません。 .daeはSCNKitでもサポートされています

  4. 金属レンダリングを使用する場合は、NSURLから直接テクスチャをロードできます。

3
Nirmal Bajpai

これにより、.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
2
Johnny Rockex

私は同じ問題に遭遇し、私が見つけた唯一の解決策はこのリンクにあります ここをクリック 。 .mtl情報をロードできたのは、シーンを通じてオブジェクトを作成することでした

let scene = SCNScene(named: "rose.obj")

バンドルにテクスチャを含む.mtlとjpgがあることを確認してください。

0
Zeeshan Arif