SceneKit の検索結果:
書き忘れていたが、SceneKit では SpriteKit の SKScene シーンを SCNMaterialProperty の各 contents に渡すことができる。 やり方としては作成した SKScene をジオメトリの firstMaterial.diffuse.contents を渡すだけ。 2D描画処理のコストはかかるが、複雑なテクスチャを作成できる。 ちなみに、SpriteKit 側も SK3DNode でイニシャライズして scnScene に設定した …
SceneKit では他のゲームエンジンと同様にシーンを複数回レンダリングし画像を合成するマルチパスレンダリングを行うことができる。 内容的には結構複雑なので、こんなことができるよというのがわかってもらえれば良いかと。 マルチパスレンダリングの使用用途は? 主に2タイプある。 レンダリングされたカラーバッファを入力として使用し、それをフラグメントシェーダーで処理するポストプロセッシング カラーグレーディングやディスプレースメントマッピングなどに使用。 もう一つは、最初にレンダ…
SceneKit でのカスタムシェーダーは主に3つ SCNProgram でプリコンパイルしたものを使う SCNShadable の shaderModifiers に Metal / GLSL のスニペットであるテキストデータを使う SCNTechnique で設定し主にポストプロセスのように画面全体の変更する際に使う 基本、シェーダーは導入の説明を書くだけで、 何個か記事を書くことになりそうだから shaderModifiers を今回、SCNTechnique を次回軽…
…e テンプレートで SceneKit を選択し作成。 GameViewController.swift を開く。 以下のコードを追加して、宇宙船のマテリアルの Normal に SKTexutre としてしたの画像を適応してみた let shipMesh = scene.rootNode.childNode(withName: "shipMesh", recursively: true)! let normalTexture = SKTexture(imageNamed: "…
SceneKit には、SCNView には overlaySKScene というプロパティがあり、SCNView の最前面に 2D ライブラリ SpriteKit のシーンである SKScene を貼り付けることができる。 そのため、UIKit にはない パーティクルや派手な演出のある UI を作成できる。 SpriteKit の詳細についてはネットや書籍で多く語られているので割愛。 Swift の バージョンが古いので手直しが必要だが、SpriteKit の書籍ならこちら…
…トもしくは、既存の SceneKit のプロジェクトに、 先ほどの lut.png をドラッグ&ドロップなどでインポートし、以下のコードのカメラのノードに適応する。 let camera = SCNCamera() camera.colorGrading.contents = UIImage(named:"lut.png") camera.colorGrading.intensity = 1.0 以前、説明しているように intensity は適応具合。 1.0 が 100%…
…の機能だったはず) SceneKit ではシーンの background や lightingEnvironment、または Blinn や Phong マテリアルの Reflective プロパティ で使用可能。 lightingEnvironment は Physically Based のシェーダーで効果を表す。 シーンの background や lightingEnvironment にテクスチャを適応したもの。 キューブマップ使用できる画像配置と画像サイズ ドキュ…
…が使用できるので、 SceneKit のオーディオ再生機能を使用する必要はないけどご紹介。 SceneKit でのオーディオ再生の特徴としては、VR や HoloLens と同様に 3D 空間の位置に対して音源を再生(ミキシング)させることができる。 SceneKit では音を鳴らす方法は2つ。 ノードの addAudioPlayer に SCNAudioSource (AVAudioNode) を設定した SCNAudioPlayer で再生する SCNAction の p…
SceneKit ではジオメトリなどノードに Core Image Filter を使用してエフェクトをつけることができ、Metal Shader で行うより簡単にできる。 多分、他のゲームエンジンではこれほど簡単にエフェクトをかけるのは難しいと思われる。 とりあえず、試した感じだと、Metal Shader の方がパフォーマンスが良さそう。 コードを書いてみる いつも通り、Xcode で Game のテンプレートで SceneKit を選択。 ship の下らへんに以下のコ…
…sult を返す。 SceneKit で用意されているヒットテスト ヒットテストの検索を実行できるメソッドは3つ。 レンダリング画像 (SCNSceneRenderer)、SCNNode、物理シミュレーションを使用した PhysicsWorld 内で調べることができる。 hitTest(_:options :) hitTestWithSegment(from:to:options :) rayTestWithSegment(from:to:options :) hitTest…
パーティクルシステムのパラメーターをみてゆく。 ちなみに、画像を設定しないと Scene Editor 上で、何も表示されない場合があるので注意。 Scene Editor の Attributes Inspector での表示 Δ=0 となっているものは、コードでは Variation と呼ばれているもの。 ここで設定した値は、時間に応じてその値の幅をプラスマイナスの値でランダムに加算する。 Image Size を 5、Birth rate の Variation 8 に…
パーティクルシステムを scn ファイルの Scene Editor で確認してみようと思うが、 カメラ、ライト、ジオメトリ、アクションなどと特に変わりはない。 scn ファイルを開いた状態で Object Library (Command + Option + Control + 3) を開き、 Particle System をドラッグ&ドロップするだけ。 Scene Graph View にもパーティクルシステムが適応されたノードが配置され、 Attributes In…
SceneKit の パーティクルシステムは他のゲームエンジン同様に、パーティクルの障害物判定と新しいパーティクルのエミッター派生させることができる。 パーティクルの処理自体軽いわけではないので多用は禁物。 今回の流れ 雨のパーティクルを落とし床に衝突 衝突の際にパーティクルの削除 削除した場所から新しいパーティクルのエミッター(パーティクルシステム)を派生させる プロジェクトファイルを作る いつも通り、Xcode の SceneKit の Game テンプレートを作成。 G…
SceneKit Particle System File (scnp) は Particle System 専用のファイル。 Scene Editor 上で、Particle System の確認ができる。 scnp ファイルは Particle System のファイルではあるが、scn では参照ができないため、コード場で行う。 scnp ファイルを Scene Editor で見た場合 パーティクルシステムの情報しかないので、Scene Graph View は存在せず…
…。 パーティクルは SceneKit で存在するオブジェクトで唯一 Scene Graph と切り離され存在となっており、 数千、数万と描画される可能性があるため、内部的に処理している。 ちなみに他のゲームエンジンと異なりパーティクルをジオメトリに設定することはできないので自力で頑張る。 パーティクルシステムの流れ パーティクルの画像設定 各パーティクルにテクスチャ画像を適応し、色合い、ブレンディングモードなどのパラメータを調整し外観を設定する。 また、アニメーション用にシー…
…することができる。 SceneKit で用意されている物理フィールド 名称 機能 Drag 動きを減速させる流体摩擦や空気抵抗のフィールド Vartex 指定した軸を中心に力が循環する渦のフィールド Radial Gravity 中心に向かって加速する重力フィールド Linner Gravity 特定の方向に加速する重力フィールド Noise ランダムな力を適用するフィールド Turbulance オブジェクトの速度に比例した大きさでランダムな力を適用するフィールド Spri…
SceneKit の物理シミュレーションでは、2つのノードを接合しその個所を考慮した物理アニメーションが用意されており、 設定されたジョイントは PhysicsWorld が持つ SCNPhysicsBehavior で設定することで物理シミュレーションが適応される。 また、ジョイントの稼働位置ごとに設定するため、ノードでの位置設定は意味がなくなる可能性あり。 SCNPhysicsBehavior はコードでしか設定できないため、 ジョイント設定は Scene Editor …
…り、XCode で SceneKit の Game テンプレートプロジェクトを作成。 今回は GameViewController.swift のみ修整。 その1 GameViewController.swift を開き、13行目に UIViewController の隣に SCNPhysicsContactDelegate を追加。 class GameViewController: UIViewController, SCNPhysicsContactDelegate {…
PhysicsBody には SCNNode のビットマスクとは別に、 以下のビットマスクが存在している。 Category mask Collision mask Contact mask Physics Inspector (Command + Option + 6) でも、 同様のパラメーターがある Category mask PhysicsBody の Category mask となり、AND演算の結果が 0 以外であれば同じカテゴリーに所属することとなる。 Col…
…メントを変更する。 SceneKit では形状と質量に合わせて自動設定されるが usesDefaultMomentOfInertia を false にして、 momentOfInertia を設定すると独自の慣性モーメントを付加できる。 例えば、X 軸回転方向に制限をかける let ball = SCNSphere(radius: 1) let ballNode = SCNNode(geometry: ball) ballNode.position.y = 10 ballN…
もう1つの項目 Velocity について。 Static は力が加えられることはないのでこの項目はない。 Physics Inspector (Command + Option + 6) の Velocity には以下のパラメーターがある Velocity Linear velocity 物理アニメーション時に現在の移動に加え指定した方向へ力を与える。 デフォルト値は x: 0.0 y: 0.0 z: 0.0 x を 1 にすると、プラス方向に メートル/秒 で移動の力が働…
…を受けていない場合、SceneKit の物理シミュレーションによって自動的に true に設定され停止状態になる。 Allows resting のチェックをオンにすることで自動的に isResting を false に戻してシミュレーションさせるか否かを決める。 デフォルト値はオン(true)。 コード let ball = SCNSphere(radius: 1) let ballNode = SCNNode(geometry: ball) ballNode.posit…
まず、最初にあたり判定から。 Scene Editor のデフォルト、もしくはコードで SCNPhysicsBody 設定の際 nil を渡すと、 そのジオメトリの形状が当たり判定となる。 また、当たり判定のジオメトリが荒いほど物理シミュレーションの演算が軽くなる。 Scene Editor での表示 Scene Editor では当たり判定が緑色のワイアーフレームで表示される。 デフォルトの場合、その形状になるため、 球を配置すると、球の当たり判定となる。 Scene Ed…
…見ていこうと思う。 SceneKit での物理シミュレーションの種類 大きく分けると以下のもの PhysicsWorld PhysicsBody PhysicsField PhysicsWorld は物理シミュレーションは全体についての設定。 PhysicsBody は物理シミュレーションをさせる対象物。 PhysicsField は風などの外部からの力を指す。 その他 物理シミュレーションにはこれ以外にも PhysicsBody の当たり判定を決める PhysicsShap…
人型のキャラクタなどに稼動できる骨を入れて、骨を動かすと該当箇所のジオメトリが変化する 所謂、Skinning と Bone を使用してアニメーションを SCNSkinner が行う。 公式ドキュメントの画像を参照 正直、コード上で書くのは手間がかかり、Scene Editor で編集ができないため、 他のゲームエンジンと同様に 3DCG のオーサリングツールで Bone を入れ、 アニメーションを設定したオブジェクトファイルを作成した方が速い。 使い方 コードで設定する場合…
Scene Editor ではライトを当てたジオメトリに対して、光を当てた表面情報を画像として Light Map を作成することができる。 内容的には Ambient Occlusion と同じような操作。 Light Map のパラメーター Scene Editor でジオメトリを選択し、 Attributes Inspector (Command + Option + 4) を開き、一番下に Baking の項目がある。 Scene Editor では以下のパラメーター…
…アルに見せる技術。 SceneKit では Model I/O フレームワークの機能から呼び出す。 光学的に Ambient Occlusion は、実際の世界では起こらないため擬似的なものである。 Ambient Occlusion のパラメーター Scene Editor でジオメトリを選択し、 Attributes Inspector (Command + Option + 4) を開き、一番下に Baking の項目がある。 Scene Editor では以下のパラメ…
…onvert to SceneKit scene file format (.scn) Enable default lighting 4つ目の .scn への変換は以前紹介済みなので割愛。 Selection Focus Selected Node Scene Editor で選択したノードが、Scene Editor の操作画面に入るようにズームイン、またはズームアウトする。 Scene Graph View でノードをダブルクリックした時と振る舞いは同じ。 Object…
SceneKit では SCNNode に SCNMorpher が紐づけられており、1つまたは複数のジオメトリを配列として渡すと、各ジオメトリへ変形させることができるモーフィングというものが使える。 (3DCG のオーサリングツールでは Blend Shape と呼ばれているものある) A のジオメトリから B のジオメトリへポリゴンの頂点が変形させられるため、ジオメトリの頂点の数が一致していないとアニメーションできない。 また、頂点に位置がおかしいとジオメトリの面がおかし…
…Blender と SceneKit では座標系が異なる。 エクスポート時に軸の変換ができないため、読み込んだジオメトリを-90度回転させる必要がある。 うっかりミス Blender 上でマテリアルを設定していないため、Scene Editor でからになっている。 Material Inspector (Command + Option + 5) から「+」ボタンで新規で作成してみる。 コードで DAE を読み込む オブジェクトデータは Xcode 上では Scene Fi…