ARKitのdaeを使って表示しているオブジェクトがなぜ荒いのかを解決した話


はじめに

ARKitを使ったSNSアプリARIZARを開発しています。
開発している時にわかったTIPS的なネタを記事にします。

ぜひARIZARをダウンロードして使ってみてください。
よろしくお願いします。

今回の課題

2つのツイートをみていただくとわかりますが、1つ目より2つ目の方がアバターと私達が呼んでいるオブジェクトがキレイになっていると思います。
今回は、解決したことについて記事にします。

なぜ荒いの?

前回の記事にその答えが隠されていました。

要するに、大きな文字を描画して小さく縮小すれば良いのではないかということがわかりました。

これです。実際のscnファイルを確認しました。

Positonが(0,-100,-200)にScaleが(0.361,0.361,0.361)になっています。
これは、PositionのZ軸が-200となっていてこれは自分から200m離れていることになります。

でもiPhoneの画面上、オブジェクトが荒い以外違和感がないのですが、逆に言うとオブジェクトが巨大だということが冷静になってみるとわかります。
もう1つ違和感があったのがiPhoneを左右に振って視点を少し変えてもオブジェクトがあまり動かないことの不思議に思っていました。

よくよく考えてみると、東京から富士山をみているような感じなのかなっと気づきました。

解決策

PositionとScaleを調整して、Positionは近く、Scaleはもっと小さくすることでオブジェクトを目の前に移動させました。
これにより本来のオブジェクトの姿が見えるようになりました。
こちらはコードで40cm手前に配置するようにしました。

改善後
        let model = SCNScene(named: named)
        if let modelNode = model?.rootNode.childNodes.first {
            modelNode.position = SCNVector3Make(0, -0.03, -0.4)
            modelNode.scale = SCNVector3(0.0006,0.0006,0.0006)
        }

最後に

ARは物体がないので座標系がピンとこないことが多いです。
荒かったり、カクカクする場合にはそのオブエクトが遠すぎないか?の観点で点検してみてはいかがでしょうか?
ありがとうございました。