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

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

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

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

Xcode

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

Swift

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

受付中

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

mars111
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リアクション

0クリップ

357閲覧

投稿2022/07/19 14:16

編集2022/07/20 00:12

やりたいこと

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

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

swift

import UIKit import RealmSwift import SceneKit import ARKit class PlayViewController: UIViewController, ARSCNViewDelegate, ARSessionDelegate { @IBOutlet weak var sceneView: ARSCNView! var imageURLList:[String] = [] var x_position_list:[Float] = [] var y_position_list:[Float] = [] var z_position_list:[Float] = [] var scale_list:[Float] = [] var x_angle_list:[Float] = [] var y_angle_list:[Float] = [] var z_angle_list:[Float] = [] var album:Album! override func viewDidLoad() { super.viewDidLoad() sceneView.delegate = self sceneView.showsStatistics = true let configuration = ARWorldTrackingConfiguration() let return_position_value = position(module: album.module) self.x_position_list = return_position_value.return_x_list self.y_position_list = return_position_value.return_y_list self.z_position_list = return_position_value.return_z_list self.scale_list = return_position_value.return_scale self.x_angle_list = return_position_value.return_x_angle self.y_angle_list = return_position_value.return_y_angle self.z_angle_list = return_position_value.return_z_angle // 環境マッピングを有効にする configuration.environmentTexturing = .automatic // People Occlusion が使える端末か判定 if ARWorldTrackingConfiguration.supportsFrameSemantics(.personSegmentationWithDepth) { // People Occlusion を使用する configuration.frameSemantics = .personSegmentationWithDepth } for (index,image_url) in imageURLList.enumerated(){ let path = getFileURL(fileName: image_url).path if FileManager.default.fileExists(atPath: path) { if let imageData = UIImage(contentsOfFile: path) { 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]) } else { print("Failed to load the image.") } } else { print("Image file not found.") } } sceneView.session.run(configuration) } // 画像取得の関数 func getFileURL(fileName: String) -> URL { let docDir = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first! return docDir.appendingPathComponent(fileName) } // AR作成の関数 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) { if let camera = sceneView.pointOfView { let position = SCNVector3(x: x_posi, y: y_posi, z: z_posi) // 偏差のベクトルを生成する let convertPosition = camera.convertPosition(position, to: nil) let node = createPhotoNode(image, position: convertPosition,scale: scale) node.eulerAngles.x = x_angle node.eulerAngles.y = y_angle node.eulerAngles.z = z_angle self.sceneView.scene.rootNode.addChildNode(node) } } private func createPhotoNode(_ image: UIImage, position: SCNVector3,scale: Float) -> SCNNode { let node = SCNNode() let scale: CGFloat = CGFloat(scale) let geometry = SCNBox(width: image.size.width * scale / image.size.height, height: scale, length: 0.00000001, chamferRadius: 0.0) geometry.firstMaterial?.diffuse.contents = image node.geometry = geometry node.position = position return node } //画像の表示位置を設定 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>){ var return_x_list:[Float] = [] var return_y_list:[Float] = [] var return_z_list:[Float] = [] var return_scale:[Float] = [] var return_x_angle:[Float] = [] var return_y_angle:[Float] = [] var return_z_angle:[Float] = [] switch module{ case "Message Title Moddule": print("Message Title Moddule") case "Messsage Contents Module": print("Messsage Contents Module") case "Message Slide Module": print("Message Slide Module") case "Photo Backscreen Module": return_x_list = [0] return_y_list = [0] return_z_list = [-0.5] return_scale = [0.3] return_x_angle = [0] return_y_angle = [0] return_z_angle = [0] case "Photo Load Message Module": 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,] 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] 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] 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] 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] 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,] default: print("Photo Load Message Module") } return(return_x_list,return_y_list,return_z_list,return_scale,return_x_angle,return_y_angle,return_z_angle) } }

swift

import UIKit import RealityKit import ARKit class ViewController: UIViewController,ARSessionDelegate { @IBOutlet var arView: ARView! var anchor = AnchorEntity() override func viewDidLoad() { super.viewDidLoad() // デリゲートを設定 arView.session.delegate = self } override func viewDidAppear(_ animated: Bool) { super.viewDidAppear(animated) resetTracking() } // ARセッションをリセットする func resetTracking() { // ビューのシーン認識オプションを設定する arView.environment.sceneUnderstanding.options = [.occlusion, .physics, .receivesLighting] let config = ARWorldTrackingConfiguration() // シーン再構築を有効化する if ARWorldTrackingConfiguration.supportsSceneReconstruction(.mesh) { config.sceneReconstruction = .mesh } // 水平面を検出する config.planeDetection = [.horizontal] // 環境テクスチャーマッピングを有効化する config.environmentTexturing = .automatic // 人物によるオクルージョンを行う if ARWorldTrackingConfiguration.supportsFrameSemantics( .personSegmentationWithDepth) { config.frameSemantics.insert(.personSegmentationWithDepth) } self.anchor = AnchorEntity(world: [0,0,-2]) let ball: MeshResource = .generateSphere(radius: 0.25) var material = UnlitMaterial() if #available(iOS 15.0, *) { let image = UIImage(named: "pictures") material.color = try! .init(tint: .white, texture: .init(.load(named: "pictures", in: nil))) } let ballEntity = ModelEntity(mesh: .generatePlane(width: 2, height: 1.5), materials: [material]) self.anchor.addChild(ballEntity) self.arView.scene.anchors.append(self.anchor) // セッションを開始する arView.session.run(config, options: [.removeExistingAnchors, .resetTracking]) } }

以下のような質問にはリアクションをつけましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

リアクションが多い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

hoshi-takanori

2022/07/19 17:40

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

2022/07/20 00:13

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

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

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

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

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

ただいまの回答率
86.12%

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

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

質問する

関連した質問

同じタグがついた質問を見る

ARKit

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

Xcode

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

Swift

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