Help us understand the problem. What is going on with this article?

SceneKitでobjファイルで読み込んだオブジェクトにテクスチャを貼る

はじめに

Structureセンサでスキャン後に書き出したデータ(.objファイル)を、下記の記事を参考にSceneKitで読み込んだところ、テクスチャが反映されなかった1
参考記事:SceneKit to show 3D content in Swift 5

.mtlを上書き

.mtlファイルの記述が足りないようなので、.mtlファイルを開き、map_Ka xxx.jpgを書き足すとテクスチャが表示された(xxx.jpgはテクスチャ画像)。
なので、.mtlファイルの上書きをすることでテクスチャを表示することはできる。

コードでテクスチャ画像を指定する

SceneKitのオブジェクトでテクスチャを設定することもできる。
上記参考記事では、SCNSceneのイニシャライザで.objファイルを読み込んでいる。

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

しかし、SCNSceneだと、テクスチャを貼る方法がない(と思われる)。
なので、オブジェクト用のSCNNode()を用意して、これにテクスチャを貼ることにした。

// Sceneに直接オブジェクトを貼るとテクスチャをイジれないので、チャイルドノードとして持たせる
let modelObj = SCNMaterial()

// objファイル読込(URL)
// アプリのディレクトリにファイルを置いている想定
if let documentDirectoryFileURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).last  {
    let fileName                = "hoge/xxx.obj" // .objファイル
    let url                     = documentDirectoryFileURL.appendingPathComponent(fileName)
    let objNode                 = SCNNode(mdlObject: MDLAsset(url: url).object(at: 0))
    objNode.geometry?.materials = [modelObj]
    scene.rootNode.addChildNode(objNode)
}

// diffuse.contentsにテクスチャを指定する
// テクスチャファイル読込(path)
if let path = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).last {
    let fileName = "/hoge/xxx.jpg" // テクスチャファイル
    modelObj.diffuse.contents   = UIImage(named: path+fileName)
}

参考:ARKitで立方体の6面それぞれに異なるテクスチャを貼る方法


  1. Srructure SDKのサンプルコードはOpen GLで描画している。また、保存した.objファイルを詠み込む方法は示されていない。Open GLを自力で書いていくのは避けたいため、SceneKitに逃げたのであった。 

moccow
名前に“3”がつくのです。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした