はじめに
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面それぞれに異なるテクスチャを貼る方法
-
Srructure SDKのサンプルコードはOpen GLで描画している。また、保存した
.objファイルを詠み込む方法は示されていない。Open GLを自力で書いていくのは避けたいため、SceneKitに逃げたのであった。 ↩