FRMSKI開発ブログ

AWS、iOS、AR/VRなど開発メモ

Swift

SceneKitで謎のスケールバグ

SceneKitでscnファイルで設定していたSCNNodeのScale値が大きくなるバグについて。 意味不明のバグだったのですが、数時間の調査の結果原因が判明しました。 Nodeの方向をカメラに向くように設定していたSCNBillboardConstraintを使わないようにすることで解…

【SceneKit】SCNノードをカメラの方へ向かせる

SCNノードのベクトルを常時カメラの方へ向かせるにはSCNBillboardConstraintを使います。 下記のソースでノードのconstraintsに指定してあげます。 let billboard = SCNBillboardConstraint() billboard.freeAxes = SCNBillboardAxis.Y //Y座標のみ追従させ…

【ARKit】3D空間座標をスクリーン座標に変換する

ARの空間座標をスクリーン座標に変換する関数を紹介します。 ARSCNViewのprojectPointで取得できます。 下記ソースです。 func getScreenPointfromARPos(sceneView:ARSCNView , pos:SCNVector3) -> CGPoint { let screenPos = sceneView.projectPoint(pos) l…

【Swift】ARSceneViewの基点を指定する

ARSceneVIewでの基点は下記コードで変更できます。 let sceneView:ARSCNView self.sceneView.session.setWorldOrigin(relativeTransform: simd_float4x4( transfrom )) simd_float4x4は4x4の行列でトランスフォームの値になります。 simd_float4x4 - simd | …

JSONEncoderで小数点以下が正確な数値にエンコードされない問題の解決法

JSONEncoderで文字列を出力する時に、Doubleで値を持つと小数点以下の桁数が正確に出力されない場合があります。こういった問題はDecimal型で出力すると解決できます。 下記のソースはDouble型で出力した例です。 struct SaveData{ save_number:Double } cla…

RxSwiftのbindでテキストフィールドと変数の値を直結させる

RxSwiftのbindを使えばテキストフィールドの値を変更したタイミングで変数を書き換える処理を簡単に実装することができます。 //TestViewController.swift側 @IBOutlet var testTextField : UITextField! let model = TestModel() let disposeBag = DisposeB…

RxSwiftの基本を学ぶ

RxとはReactive Extensionsの略で非同期処理やイベント処理などを宣言的に記述することができる便利なライブラリです。 RxのSwift実装なのでRxSwiftと言います。 インストール方法 pod 'RxSwift'をPodfileに記述しpod installでインストールできます。 Obser…

SCNPhysicsBodyのプロパティ一覧

SceneKitの物理シミュレーションはSCNPhysicsBodyを使えば簡単に実装することができます。物理演算を正確に制御するためには重力や摩擦についてのプロパティを正確に知ることが重要です。 下記表でSCNPhysicsBodyのプロパティを一覧にしてまとめてみました。…

Swiftにおける基本のMVCアーキテクチャについて

デザインパターンといえば、MVC・MVP・CleanArchitectureなど様々なアーキテクチャありますが、今回は基本の基本、であるMVCについて、Swiftにおける基本をまとめました。 MVCについて説明 まずMVCとはアプリケーションを実装するためのデザインパターンで、…

【ARKit】lightEstimateでカメラ画像の明るさを環境光に反映

上画像のようにARKitでカメラ画像の明るさをライティングに反映する方法をご紹介します。 ①SceneKitのライティングを作成 まずはライティング用ノードを作成してrootNodeに追加します。 var sceneLight: SCNLight!//シーンのライト override func viewDidLoa…

Swfitでアプリ内にテキストファイルを書き出す

テキストファイルを書き出してiTunesで取り出す手順を紹介します。 ①FileManager.default.urlsでドキュメントのパスを取得 let documentDirectoryFileURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).last { ②テキストファイ…

CoreLocationで位置情報と方角を取得する

CoreLocationで位置情報を取得する方法を紹介します。 ①CoreLocation.frameworkを追加 「General>Linked Frameworks and Libraries」にCoreLocation.frameworkを追加しimportします。 import CoreLocation ②info.plistにKeyを設定 info.plistでPrivacy - Loc…

分かりにくいSwiftのオプショナル型「?」と「!」の違いについて

オプショナル型について簡略に説明している記事が少なかったので短くまとめて見ました。 オプショナル型とは? オプショナル型は変数にnilの代入を許容するデータ型です。nilはデータがない状態。 そして、オプショナル型の変数には「?」か「!」をつけます。…

Swiftでプロパティ監視(willSet/didSet)

Swiftで変数の変更を監視するには「willSet/didSet」を使います。 プロパティ監視はsetterやgetterなどのプロパティ代入とは違い、プロパティの変更時に呼ばれます。 プロパティ変更前に呼ばれるのは「willSet」、変更後に呼ばれるのが「didSet」になります…

超簡単SwiftのInterfaceBuilderでジェスチャー取得

SwiftのInterfaceBuilderを使えばタップやスワイプなどジェスチャーを簡単に取得できます。 【手順】 ①ライブラリからViewのストーリーボード へTapGestureRecognizerオブジェクトをドラッグドロップ ②ViewController.swiftに@IBActionでタップ関数を作成 @I…

ARKitでカメラの位置を取得する

ARKitでカメラの位置を取得する方法です。 ARSCNView.sessionのデリゲート(ARSessionDelegate)をViewController自身に設定します。 sceneView.session.delegate = self セッションのイベントにアクセスしてフレームからカメラを取得出来ます。 func sessio…

SceneKitで3Dシーンを作成「SceneKit Scene File(.scn)」

SceneKitではSceneKit Scene File(scn)を新規作成することでシーンを作成できる。 シーンでは3Dオブジェクトの配置などがエディタ上で可能。 作成したシーンファイルは下記ソースでARSCNViewに配置できます。 let scene = SCNScene(named: "ship.scn")! scen…

【ARKit】ARSCNDebugOptionsで特徴点と座標軸を表示する

CoreML開発に特徴点もしくは座標軸を表示する方法を紹介します。 ARSCNDebugOptionsを設定します。 特徴点を表示するにはshowFeaturePoints、 座標軸を表示するにはshowWorldOrigins。 下記は両方表示するコードです。 self.sceneView.debugOptions = [ARSCN…