はじめに
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
に逃げたのであった。 ↩