このページの本文へ

Swift Playgroundsで学ぶiOSプログラミング第97回

ScenKitに組み込みのジオメトリを利用

いろいろな形のノードをシーンの中に配置する

2018年07月27日 17時00分更新

文● 柴田文彦 編集●吉田ヒロ

  • この記事をはてなブックマークに追加
  • 本文印刷

 前回から、今流行りの用語で言えばVR(仮想現実)を実現するためのフレームワークであるSceneKitを扱っています。前回にも述べたように、SceneKitはAR(拡張現実)を実現するためのARKitの中で、非現実世界を構築するための基幹技術として利用されています。これらは、iOSやmacOSで、最先端の「なんとかリアリティ」アプリを実現するために非常に重要な技術となっているわけです。

 前回は、SceneKitの扱う「世界」に相当するシーンを作成し、そこに四角い箱のノードを配置しました。また、シーンビューを用意して、そこにシーンを設定することで、シーンを画面に表示することができました。

 前回は、四角い箱以外にはテキストから作った文字型のノードを表示しただけでしたが、今回、もっと多様なノードを設置してみることにします。前回もそうだったのですが、いろいろな形のノードを作るには、まずSceneKitが用意している定形のジオメトリ(外形)と呼ばれるオブジェクトを作成します。ノードを初期化する際に、そのジオメトリを指定することで、簡単に指定した形状のノードを作成することができます。既定のジオメトリとしては、SCNGeometryクラスを継承する数種類のクラスが用意されています。

 今回は、まず代表的な何とおりかのジオメトリからノードを作成し、それをシーンの中に配置して形状を確認します。その後、特殊なノードとして、照明やカメラをシーンの中の任意の場所に配置する方法も確かめていきましょう。

いろいろなジオメトリからノードを作成して配置する

 今回も、前回の最終的なプログラムと、ほぼ同じところからスタートします。前回の最後には、四角い箱のノードと、文字型を立体的にしたノードを配置していました。今回は、文字型のノードはやめて、その代わり、あらゆるジオメトリの中で、最も基本的なものの1つであるで床(ゆか)を表すノードを配置することにします。また、床の上に箱が乗っている形にしたいので、箱の位置を、高さの半分だけ上にずらして、箱の底面がちょうど床に接するようにします。

 前回と同様、ビューコントローラーのviewWillAppearメソッドの中で、ジオメトリとノードを作成して、シーンのルートノードの子ノードとして設置していきます。床のジオメトリはSCNFloorクラスのオブジェクトです。ここではwidthとlengthのプロパティで幅と長さを指定していますが、指定しなければ無限の広さの床になります。床は常にy=0の平面で、厚みもゼロです。床には濃い青の色と、反射率として0.5を設定しました。

今回は、前回の最後のプログラムのviewWillAppearメソッドの中身だけを書き換えるところからスタートします。まずは、濃い青の床面と、その上に載ったオレンジ色の四角い箱をシーンに配置します

 四角い箱のジオメトリは、前回も登場したSCNBoxですが、大きさと色をちょっと変更しています。すでに述べたように、5.0の高さに対して、その半分の2.5だけy軸の正方向にずれた位置を指定しています。

 このプログラムを動かすと、暗い青の床の上にオレンジの四角い箱が載って周囲に箱の色が反射している様子が表示されます。

床面の反射率は0.5に設定していますが、暗い色との相乗効果で深みのある反射効果が得られています

  反射する床が加わったことで、いちだんと臨場感が増したような感じがするでしょう。

 それでは、この床の上に、色々な形のノードを置いていきましょう。とりあえず、いくつかのノードを配置していって、結果は最後に確認することにします。

 まずは、カプセル型のオブジェクトを作るSCNCapsuleクラスのジオメトリから作ったノードです。このジオメトリはカプセルの半径と高さを指定して作ります。x軸のマイナス方向に10だけ離して配置してみました。

カプセル型のSCNCapsuleジオメトリから作ったノードをシーンに追加しています

 次に、コーン、つまり三角錐を表すSCNConeです。底面の半径と高さだけでなく、上面の半径も指定できます。ここに0を指定すれば、先の尖った純粋な三角錐になりますが、0以外を指定すると、ちょうど台形を回して作ったような形になります。

円錐形のSCNConeから作ったノードを追加しています。円錐といっても、頂点付近を切り取った台形のような形にしてあります

 比較的単純な形としては、シリンダー、つまり円筒もあります。これはSCNCylinderに半径と高さだけを指定して作ります。

単純な円柱を表すSCNCylinderジオメトリから作ったノードを配置しています

 その次はピラミッド、つまり四角錐です。これはSCNPyramidクラスのオブジェクトを、底面の幅と長さ、そして高さを指定して作ります。

四角錐、つまりピラミッド型のSCNPylamidジオメトリからノードを作成してシーンに追加しています

 シリンダーの中をくり抜いて筒にしたようなものは、SCNTubeクラスで作るチューブです。内半径、外半径、高さを指定します。

円柱の内側を別の円柱でくりぬいたような円筒、つまりチューブを表すSCNTubeジオメトリのノードを追加しています

 ドーナッツ型のジオメトリもあります。トーラス(円環面体)といって、SCNTorusのオブジェクトです。これはリングの半径とパイプの半径の2つを指定して作ります。リングの半径がドーナッツの大きさを決めて、パイプの半径がドーナッツの太さを決めると言えばわかりやすいでしょうか。

いわゆるドーナッツ型は、トーラスとも呼ばれます。それはSCNTorusジオメトリを使って再現することができます

 以上のジオメトリに適当な色を付け、それぞれから作成したノードを適当な間隔を開けて配置してみました。プログラムを動かしてみると、ジオメトリのカタログのようなシーンが展開されます。

最初に配置した床と四角い箱に加えて、6つの新たなノードを適当に配置したシーンです。陰影や反射によって、それぞれの形状がよくわかります

 床面に反射させることで、各ノードの底面付近の形状もわかりやすくなっています。

この連載の記事

週間ランキングTOP5

ASCII倶楽部会員によく見られてる記事はコレだ!

ASCII倶楽部の新着記事

会員専用動画の紹介も!