[Swift/ARKit2] ライコウは松屋派、スイクンはすき家派。


概要

先日初めてArkit2を触り、3Dモデルを用いて何かしてみたいなーと思っていたので、ちょうど良い機会だと思い、以下ツイートに便乗。エンテイの後に続き、ライコウとスイクンの牛丼業界参画を支援する。

アーキテクチャ

Xcode上でARKit2を利用して、Swiftでコーディングしています。コード量( ViewController.swift )は100行もないです。

GitHub

全てのコードを公開しています。解説のためにコードに What のコメントを残しているので、見れば大体理解できると思います。

解説

以下Qiitaが参考になりました。

ただたしかにクマさんは表示できるのですが、他の free3d でダウンロードした3Dモデル素材ではうまくいかず、ここが一番ハマりました。時にはうまくいくものもあったので、できる素材できない素材で分けていった結果、おそらく素材そのものにテクスチャがないとダメだとわかりました。free3dにはポケモン素材はたくさんあるのですが、ほとんどテクスチャがありませんでした。

そこで自分でテクスチャを貼る方法を調べたのですがいまいち分からず、テクスチャありのライコウとスイクンの3Dモデル素材を探すことにしました。無事以下にありました。他にも3Dモデルの素材置き場は後述しています。

素材の読み込みは適宜変えてください。


//sceneとnodeを読み込み
guard let scene = SCNScene(named: "model.scn", inDirectory: "art.scnassets/Raikou") else {fatalError()}
guard let bearNode = scene.rootNode.childNode(withName: "SketchUp", recursively: true) else {fatalError()}

素材置き場

ポケモンの素材でいうと、以下4つでは確認できました。

その他、人や家具など様々な3Dモデルが以下記事にまとまっているので、参考にしてみてください。

daeからscnの変換方法

Xcode上で変換できます。

rarファイルの解凍方法

素材の中には拡張子が rar という圧縮ファイルがあります。 brewunrar をインストールして利用してください。

$ brew install unrar
$ unrar e hoge.rar

展望・感想

水平面を検知する度にライコウやスイクンを表示されてしまうので、1体だけ表示するために以下のコードを書き加えたが、ベストプラクティスはなんなのか。


class OnceExec {
    var isExec = false
    func call(onceExec: ()->()){
        if !isExec {
            onceExec()
            isExec = true
        }
    }
}

onceExec.call {
 // 1度だけ呼びたいコード
}

複雑な構造のモデルの場合は .scn ではなく .dae から SCNScene を作った方が良いのか。

スイクン縮尺ミスって小さくなっちゃったのはご愛嬌。


// Xmを基準にした縮尺を計算
let magnification = 0.5 / w
bearNode.scale = SCNVector3(magnification, magnification, magnification)