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

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

ただいまの
回答率

90.50%

  • Swift

    7245questions

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

  • iOS

    3998questions

    iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

複数のオブジェクトを表示したい

受付中

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 147

curh

score 1

Swift初心者です.
ARkitを用いて二つののオブジェクトを表示させたいです.

一つは,Boxのオブジェクト(node)で,こちらは表示できています.
もう一つはARkitに標準に入っているship.scnオブジェクト(myNode)です.
エラーはないのですが,実行するとship.scnオブジェクトのみ表示されません.

将来的に複数のscnファイルのオブジェクトを平面上に表示させたく,試しに色々とやっています.

やってみたこと
・myNodeの座標を変えてみる

至らぬ点が多いですが,よろしくおねがいいたします.
ソースコードは以下のようになります.

import UIKit
import SceneKit
import ARKit

class ViewController: UIViewController, ARSCNViewDelegate {

    @IBOutlet var sceneView: ARSCNView!

    override func viewDidLoad() {
        super.viewDidLoad()

        sceneView.delegate = self
        sceneView.showsStatistics = true
        let scene = SCNScene()

        //Color Setting , random
        let random: CGFloat = CGFloat(arc4random() % 10)  //乱数値設定(使用してない,0~9の範囲を指定している)
        let r: CGFloat = CGFloat(arc4random_uniform(255)+1) / 255.0
        let g: CGFloat = CGFloat(arc4random_uniform(255)+1) / 255.0
        let b: CGFloat = CGFloat(arc4random_uniform(255)+1) / 255.0
        //let color: UIColor = UIColor(red: r, green: g, blue: b, alpha: 1.0)

        // node (Box)
        let box = SCNBox(width: 0.2, height: 0.2, length: 0.2, chamferRadius: 0)  //形,大きさ
        let material = SCNMaterial()
        material.diffuse.contents = UIColor(red:r, green:g, blue:b, alpha: 1)
        let node = SCNNode()
        node.geometry = box
        material.name = "Color"
        node.geometry?.materials = [material]
        node.position = SCNVector3(0, 0.2, -1)
        scene.rootNode.addChildNode(node)

        // myNode
        let myScene = SCNScene(named: "art.scnassets/ship.scn")!
        let myNode = myScene.rootNode.childNode(withName: "ship",recursively: true)
        myNode?.position = SCNVector3(0,-1,0)
        sceneView.scene.rootNode.addChildNode(myNode!)


        //gesture 検知
        let tapRecognizer = UITapGestureRecognizer(target: self, action:#selector(tapped))   //タップされたら呼ばれる関数tapped
        self.sceneView.addGestureRecognizer(tapRecognizer)

        sceneView.scene = scene
        sceneView.debugOptions = ARSCNDebugOptions.showFeaturePoints //デバッグ用オプション

    }

    //objective-C func tapped
    @objc func tapped(recognizer: UIGestureRecognizer) {
        let sceneView = recognizer.view as! SCNView   //as!型変換,タップされたオブジェクトのシーンを取得
        let touchLocation = recognizer.location(in: sceneView)    //タッチされた座標を返す
        let hitResults = sceneView.hitTest(touchLocation, options: [:])    //hitTestメソッドを利用,

        if !hitResults.isEmpty {     //もしタッチしたデータがあれば(先頭の!はnotの意味)
            let node = hitResults[0].node   //ノードに,先頭のノードの値を取り出す
            let material = node.geometry?.material(named: "Color")  //Colorは対応する上で設定済み
            //node.removeFromParentNode()
            let sphere = SCNSphere(radius: 0.2)
            node.geometry = sphere
            //material?.diffuse.contents = UIImage(named: "earthmap.jpeg")     //material?でアンラップ,color chnage, change graphic
        }
    }

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)

        let configuration = ARWorldTrackingConfiguration()
        configuration.planeDetection = .horizontal //平面検知
        sceneView.session.run(configuration)
    }

    override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(animated)

        sceneView.session.pause()
    }


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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

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

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

0

ノードの追加先が微妙に違うようです。
scene.rootNode.addChildNode(node)
sceneView.scene.rootNode.addChildNode(myNode!)

同じシーンに追加してみてください。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

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

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

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 90.50%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

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

  • Swift

    7245questions

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

  • iOS

    3998questions

    iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。