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

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

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

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

iOS

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

Swift

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

Q&A

解決済

1回答

1235閲覧

SCNActionで移動しながら回転させたい

hodoru3sei

総合スコア284

ARKit

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

iOS

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

Swift

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

0グッド

0クリップ

投稿2021/05/03 05:21

ARKitで空間上に表示しているオブジェクトに対して円の形に移動するアニメーションをさせたいと考えています。
移動と回転を同じタイミングで走らせたいのですが、以下のようにSCNAction.sequenceで移動と回転をくっつけてしまうと移動のアニメーションが完了した後に回転が始まり円のように回転してアニメーションさせることができませんでした。
どうしたら円のように同じところをグルグル回るアニメーションを実装できるのでしょうか?

swift

1let moveAction = SCNAction.move(by: SCNVector3(1, 0, 0), duration: 2) 2let rotateAction = SCNAction.rotateBy(x: .pi, y: 0, z: 0, duration: 2) 3let action = SCNAction.sequence([moveAction, rotateAction]) 4node.runAction(SCNAction.repeatForever(action))

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

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

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

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

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

guest

回答1

0

ベストアンサー

実装イメージ的には以下の様なことでしょうか。
もしイメージが違ったら回答スルーして頂いて大丈夫です。

実装イメージ
赤い立方体の周りを、青い球体が円形に移動しているイメージ。
イメージ説明

実装概要
ARKit SceneKit かわいいアニメーション・レシピ・ブック
↑こちらの参考記事内にある、「オブジェクトの中心の回転と、回転軸をずらす場合を同時に表示するとこういうイメージ」という実装方法を参考にすることで実現できそうですが、いかがでしょうか。
(中華料理屋とかにある、中華テーブルの回転をイメージすると想像付きやすいかもしれません)

今回実装した手順
こちらで実装した大まかな手順は以下です。
1、回転の軸となる空ノードを生成
2、回転移動している様に見せる球体ノードを生成(今回のイメージだと、青い球体)
3、球体ノードを、軸となる空ノードのChiledNodeに指定
※ChiledNodeに指定する際、回転移動用ノードの軸をずらす
4、空ノード自体を回転させると、球体ノードが円形に移動している様に見えるようになる

サンプルコード
アクションの処理自体は詳しくないので、追加質問あった際にはお答えできないです。すみません。

Swift

1import UIKit 2import SceneKit 3import ARKit 4 5class ViewController: UIViewController, ARSCNViewDelegate { 6 7 @IBOutlet var sceneView: ARSCNView! 8 9 override func viewDidLoad() { 10 super.viewDidLoad() 11 12 sceneView.delegate = self 13 sceneView.showsStatistics = true 14 sceneView.scene = SCNScene(); 15 16 // 回転の中心に表示する、赤い立方体ノード生成 17 let box = SCNBox(width: 0.01, height: 0.01, length: 0.01, chamferRadius: 0) 18 let boxNode = SCNNode(geometry: box) 19 boxNode.name = "cube" 20 boxNode.geometry?.firstMaterial?.diffuse.contents = UIColor.red 21 boxNode.position = SCNVector3(0, 0, 0) 22 sceneView.scene.rootNode.addChildNode(boxNode) 23 24 // 回転の軸となる、空のノード生成 25 let emptyNode = SCNNode() 26 sceneView.scene.rootNode.addChildNode(emptyNode) 27 28 // 赤い球体ノード生成 29 let sphere = SCNSphere(radius: 0.01) 30 let sphereNode = SCNNode(geometry: sphere) 31 sphereNode.name = "sphere" 32 sphereNode.geometry?.firstMaterial?.diffuse.contents = UIColor.blue 33 34 // 空のノードに、赤い球体ノード追加 35 emptyNode.addChildNode(sphereNode) 36 emptyNode.position = SCNVector3(0, 0, 0) 37 sphereNode.position = SCNVector3(0.05, 0, 0) 38 39 // 空のノードを回転させることで、赤い球体が円形に回転してる様に見せる 40 emptyNode.runAction(SCNAction.repeatForever(SCNAction.rotateBy(x: 0, y: 1, z: 0, duration: 0.5))) 41 } 42 43 override func viewWillAppear(_ animated: Bool) { 44 super.viewWillAppear(animated) 45 46 let configuration = ARWorldTrackingConfiguration() 47 sceneView.session.run(configuration) 48 } 49 50 override func viewWillDisappear(_ animated: Bool) { 51 super.viewWillDisappear(animated) 52 53 sceneView.session.pause() 54 } 55 56 57 func session(_ session: ARSession, didFailWithError error: Error) { 58 // Present an error message to the user 59 60 } 61 62 func sessionWasInterrupted(_ session: ARSession) { 63 // Inform the user that the session has been interrupted, for example, by presenting an overlay 64 65 } 66 67 func sessionInterruptionEnded(_ session: ARSession) { 68 // Reset tracking and/or remove existing anchors if consistent tracking is required 69 70 } 71}

投稿2021/05/03 08:27

編集2021/05/03 08:29
tsuki01

総合スコア1751

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

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

hodoru3sei

2021/05/03 09:21

なるほど! ありがとうございます????‍♂️
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問