質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.44%
ARKit

ARKitは、iPhone/iPad向けのARアプリ用フレームワーク。iOS11以降に標準搭載されています。これを用いたARアプリは、特殊なデバイスがなくてもiPhone/iPadの単眼カメラを使用して動作することが可能です。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

0回答

1059閲覧

ARKit RealityKitに保存された画像を表示する

mars111

総合スコア24

ARKit

ARKitは、iPhone/iPad向けのARアプリ用フレームワーク。iOS11以降に標準搭載されています。これを用いたARアプリは、特殊なデバイスがなくてもiPhone/iPadの単眼カメラを使用して動作することが可能です。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2022/07/19 14:16

編集2022/07/20 00:12

やりたいこと

現在、こちらのサイトを参考に、端末に画像を保存し、そのディレクトリをRealmSwiftに保存しています。
そしてこの保存された画像を、以下のように呼び出し、sceneViewにセットすることで、SceneKitで表示させています。

今回、SceneKitではなくRealityKitで同様の機能を実現したいと思っており、こちらのサイトを参考にしています。
Assets内に登録している画像については表示できるようになったのですが、realmから呼び出されたディレクトリをもとに引っ張ってきた画像を表示するにはどうしたら良いのかわからず質問させていただきました

swift

1import UIKit 2import RealmSwift 3import SceneKit 4import ARKit 5 6class PlayViewController: UIViewController, ARSCNViewDelegate, ARSessionDelegate { 7 8 @IBOutlet weak var sceneView: ARSCNView! 9 10 11 var imageURLList:[String] = [] 12 13 var x_position_list:[Float] = [] 14 var y_position_list:[Float] = [] 15 var z_position_list:[Float] = [] 16 var scale_list:[Float] = [] 17 18 var x_angle_list:[Float] = [] 19 var y_angle_list:[Float] = [] 20 var z_angle_list:[Float] = [] 21 22 var album:Album! 23 24 override func viewDidLoad() { 25 super.viewDidLoad() 26 27 sceneView.delegate = self 28 sceneView.showsStatistics = true 29 30 let configuration = ARWorldTrackingConfiguration() 31 32 let return_position_value = position(module: album.module) 33 self.x_position_list = return_position_value.return_x_list 34 self.y_position_list = return_position_value.return_y_list 35 self.z_position_list = return_position_value.return_z_list 36 self.scale_list = return_position_value.return_scale 37 self.x_angle_list = return_position_value.return_x_angle 38 self.y_angle_list = return_position_value.return_y_angle 39 self.z_angle_list = return_position_value.return_z_angle 40 41 // 環境マッピングを有効にする 42 configuration.environmentTexturing = .automatic 43 44 // People Occlusion が使える端末か判定 45 46 if ARWorldTrackingConfiguration.supportsFrameSemantics(.personSegmentationWithDepth) { 47 // People Occlusion を使用する 48 configuration.frameSemantics = .personSegmentationWithDepth 49 } 50 51 52 53 for (index,image_url) in imageURLList.enumerated(){ 54 55 let path = getFileURL(fileName: image_url).path 56 57 if FileManager.default.fileExists(atPath: path) { 58 if let imageData = UIImage(contentsOfFile: path) { 59 self.setImageToScene(image: imageData,x_posi: self.x_position_list[index],y_posi: self.y_position_list[index],z_posi: z_position_list[index],scale: scale_list[index],x_angle:x_angle_list[index],y_angle: y_angle_list[index],z_angle: z_angle_list[index]) 60 } 61 else { 62 print("Failed to load the image.") 63 } 64 } 65 else { 66 print("Image file not found.") 67 } 68 } 69 70 sceneView.session.run(configuration) 71 72 } 73 74 75 76// 画像取得の関数 77 func getFileURL(fileName: String) -> URL { 78 let docDir = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first! 79 return docDir.appendingPathComponent(fileName) 80 } 81 82 83// AR作成の関数 84 private func setImageToScene(image: UIImage,x_posi: Float,y_posi: Float,z_posi: Float,scale: Float,x_angle: Float,y_angle: Float,z_angle: Float) { 85 if let camera = sceneView.pointOfView { 86 let position = SCNVector3(x: x_posi, y: y_posi, z: z_posi) // 偏差のベクトルを生成する 87 let convertPosition = camera.convertPosition(position, to: nil) 88 let node = createPhotoNode(image, position: convertPosition,scale: scale) 89 node.eulerAngles.x = x_angle 90 node.eulerAngles.y = y_angle 91 node.eulerAngles.z = z_angle 92 self.sceneView.scene.rootNode.addChildNode(node) 93 } 94 } 95 96 private func createPhotoNode(_ image: UIImage, position: SCNVector3,scale: Float) -> SCNNode { 97 let node = SCNNode() 98 let scale: CGFloat = CGFloat(scale) 99 let geometry = SCNBox(width: image.size.width * scale / image.size.height, 100 height: scale, 101 length: 0.00000001, 102 chamferRadius: 0.0) 103 geometry.firstMaterial?.diffuse.contents = image 104 node.geometry = geometry 105 node.position = position 106 return node 107 } 108 109 110//画像の表示位置を設定 111 func position(module:String) -> (return_x_list:Array<Float>, return_y_list:Array<Float>, return_z_list:Array<Float>, return_scale:Array<Float>,return_x_angle:Array<Float>, return_y_angle:Array<Float>,return_z_angle:Array<Float>){ 112 var return_x_list:[Float] = [] 113 var return_y_list:[Float] = [] 114 var return_z_list:[Float] = [] 115 var return_scale:[Float] = [] 116 var return_x_angle:[Float] = [] 117 var return_y_angle:[Float] = [] 118 var return_z_angle:[Float] = [] 119 120 121 switch module{ 122 case "Message Title Moddule": 123 print("Message Title Moddule") 124 case "Messsage Contents Module": 125 print("Messsage Contents Module") 126 case "Message Slide Module": 127 print("Message Slide Module") 128 case "Photo Backscreen Module": 129 return_x_list = [0] 130 return_y_list = [0] 131 return_z_list = [-0.5] 132 return_scale = [0.3] 133 return_x_angle = [0] 134 return_y_angle = [0] 135 return_z_angle = [0] 136 137 138 case "Photo Load Message Module": 139 return_x_list = [-3,3,-3,3,-3,3,-3,3,-3,3,-3,3,-3,3,-3,3,-3,3,-3,3,-3,3,-3,3,-3,3,-3,3,-3,3,] 140 return_y_list = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] 141 return_z_list = [-1,-2,-3,-4,-5,-6,-7,-8,-9,-10,-11,-12,-13,-14,-15,-16,-17,-18,-19,-20,-21,-22,-23,-24,-25,-26,-27,-28,-29,-30] 142 return_scale = [2.0,2.0,2.0,2.0,2.0,2.0,2.0,2.0,2.0,2.0,2.0,2.0,2.0,2.0,2.0,2.0,2.0,2.0,2.0,2.0,2.0,2.0,2.0,2.0,2.0,2.0,2.0,2.0,2.0,2.0] 143 return_x_angle = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] 144 return_y_angle = [.pi/3,-.pi/3,.pi/3,-.pi/3,.pi/3,-.pi/3,.pi/3,-.pi/3,.pi/3,-.pi/3,.pi/3,-.pi/3,.pi/3,-.pi/3,.pi/3,-.pi/3,.pi/3,-.pi/3,.pi/3,-.pi/3,.pi/3,-.pi/3,.pi/3,-.pi/3,.pi/3,-.pi/3,.pi/3,-.pi/3,.pi/3,-.pi/3,] 145 default: 146 print("Photo Load Message Module") 147 148 } 149 150 return(return_x_list,return_y_list,return_z_list,return_scale,return_x_angle,return_y_angle,return_z_angle) 151 152 } 153 154} 155

swift

1 2import UIKit 3import RealityKit 4import ARKit 5 6class ViewController: UIViewController,ARSessionDelegate { 7 8 @IBOutlet var arView: ARView! 9 var anchor = AnchorEntity() 10 11 12 override func viewDidLoad() { 13 super.viewDidLoad() 14 15 // デリゲートを設定 16 arView.session.delegate = self 17 18 19 } 20 21 22 override func viewDidAppear(_ animated: Bool) { 23 super.viewDidAppear(animated) 24 25 resetTracking() 26 } 27 28 29 // ARセッションをリセットする 30 func resetTracking() { 31 // ビューのシーン認識オプションを設定する 32 arView.environment.sceneUnderstanding.options = [.occlusion, 33 .physics, 34 .receivesLighting] 35 let config = ARWorldTrackingConfiguration() 36 // シーン再構築を有効化する 37 if ARWorldTrackingConfiguration.supportsSceneReconstruction(.mesh) { 38 config.sceneReconstruction = .mesh 39 } 40 41 // 水平面を検出する 42 config.planeDetection = [.horizontal] 43 44 // 環境テクスチャーマッピングを有効化する 45 config.environmentTexturing = .automatic 46 47 // 人物によるオクルージョンを行う 48 if ARWorldTrackingConfiguration.supportsFrameSemantics( 49 .personSegmentationWithDepth) { 50 config.frameSemantics.insert(.personSegmentationWithDepth) 51 } 52 53 self.anchor = AnchorEntity(world: [0,0,-2]) 54 55 let ball: MeshResource = .generateSphere(radius: 0.25) 56 57 var material = UnlitMaterial() 58 59 if #available(iOS 15.0, *) { 60 let image = UIImage(named: "pictures") 61 62 material.color = try! .init(tint: .white, 63 texture: .init(.load(named: "pictures", 64 in: nil))) 65 } 66 67 let ballEntity = ModelEntity(mesh: .generatePlane(width: 2, height: 1.5), materials: [material]) 68 69 self.anchor.addChild(ballEntity) 70 71 self.arView.scene.anchors.append(self.anchor) 72 // セッションを開始する 73 arView.session.run(config, options: [.removeExistingAnchors, .resetTracking]) 74 75 } 76 77 78 79} 80 81 82

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hoshi-takanori

2022/07/19 17:40

RealityKit で書いたコードをご提示ください。
mars111

2022/07/20 00:13

修正いたしました、よろしくお願いいたします
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.44%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問