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

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

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

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

Swift

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

AR(Augmented Reality)

AR(Augmented Reality)とは、拡張現実のことです。人が認識する現実の環境で視覚・聴覚などの知覚が感知する情報をコンピュータで拡張する技術、もしくはその環境そのものを表す言葉です。

Q&A

解決済

1回答

402閲覧

SwiftのARKitを使って自転、公転もできる太陽系ARアプリを作りたい

YuukiIbata

総合スコア15

Xcode

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

Swift

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

AR(Augmented Reality)

AR(Augmented Reality)とは、拡張現実のことです。人が認識する現実の環境で視覚・聴覚などの知覚が感知する情報をコンピュータで拡張する技術、もしくはその環境そのものを表す言葉です。

0グッド

0クリップ

投稿2018/09/16 05:42

前提・実現したいこと

環境はXcode9.4.1 Swift4.0です。
ARKitを用いて、太陽系を作りたいです。ただ惑星を並べるだけでなく、
自転も公転も行えるようにしたいです。
アドバイスいただければ幸いです。

発生している問題・エラーメッセージ

自転まではできましたが、公転の方法が分からないです…。

(ソースコードの惑星の自転の速さは、まだ適当に設定しているだけなので無視していただければ笑)

該当のソースコード

Swift4.0

1import UIKit 2import SceneKit 3import ARKit 4 5class ViewController: UIViewController, ARSCNViewDelegate { 6 7 @IBOutlet var sceneView: ARSCNView! 8 9 10 override func viewDidLoad() { 11 super.viewDidLoad() 12 13 // Set the view's delegate 14 sceneView.delegate = self 15 16 // Show statistics such as fps and timing information 17 sceneView.showsStatistics = true 18 19 // Create a new scene 20 let scene = SCNScene() 21 22 23 //太陽 24 let sunGeometry = SCNSphere(radius: 0.2) 25 26 let sunMaterial = SCNMaterial() 27 sunMaterial.diffuse.contents = UIImage(named: "sun") 28 29 sunGeometry.materials = [sunMaterial] 30 31 let sunNode = SCNNode(geometry: sunGeometry) 32 33 sunNode.position = SCNVector3(0, 0, -3) 34 35 sunNode.runAction(SCNAction.repeatForever(SCNAction.rotateBy(x: 0, y: 20, z: 0, duration: 4))) 36 37 scene.rootNode.addChildNode(sunNode) 38 39 40 //水星 41 let mercuryGeometry = SCNSphere(radius: 0.01) 42 43 let mercuryMaterial = SCNMaterial() 44 mercuryMaterial.diffuse.contents = UIImage(named: "mercury") 45 46 mercuryGeometry.materials = [mercuryMaterial] 47 48 let mercuryNode = SCNNode(geometry: mercuryGeometry) 49 50 mercuryNode.position = SCNVector3(0.5, 0, -3) 51 52 mercuryNode.runAction(SCNAction.repeatForever(SCNAction.rotateBy(x: 0, y: 20, z: 0, duration: 4))) 53 54 scene.rootNode.addChildNode(mercuryNode) 55 56 //金星 57 let venusGeometry = SCNSphere(radius: 0.01) 58 59 let venusMaterial = SCNMaterial() 60 venusMaterial.diffuse.contents = UIImage(named: "venus") 61 62 venusGeometry.materials = [venusMaterial] 63 64 let venusNode = SCNNode(geometry: venusGeometry) 65 66 venusNode.position = SCNVector3(1, 0, -3) 67 68 venusNode.runAction(SCNAction.repeatForever(SCNAction.rotateBy(x: 0, y: 20, z: 0, duration: 4))) 69 70 scene.rootNode.addChildNode(venusNode) 71 72 73 74 //地球 75 let earthGeometry = SCNSphere(radius: 0.01) 76 77 let material = SCNMaterial() 78 material.diffuse.contents = UIImage(named: "earth") 79 80 earthGeometry.materials = [material] 81 82 let earthNode = SCNNode(geometry: earthGeometry) 83 84 earthNode.position = SCNVector3(1.5, 0, -3) 85 86 earthNode.runAction(SCNAction.repeatForever(SCNAction.rotateBy(x: 0, y: 20, z: 0, duration: 4))) 87 88 scene.rootNode.addChildNode(earthNode) 89 90 91 //月 92 let moonGeometry = SCNSphere(radius: 0.005) 93 94 let moonMaterial = SCNMaterial() 95 96 moonMaterial.diffuse.contents = UIColor.yellow 97 98 moonGeometry.materials = [moonMaterial] 99 100 let moonNode = SCNNode(geometry: moonGeometry) 101 102 moonNode.position = SCNVector3(2 ,0 , -3) 103 104 scene.rootNode.addChildNode(moonNode) 105 106 107 // 火星 108 let marsGeometry = SCNSphere(radius: 0.01) 109 110 let marsMaterial = SCNMaterial() 111 marsMaterial.diffuse.contents = UIImage(named: "mars") 112 113 marsGeometry.materials = [marsMaterial] 114 115 let marsNode = SCNNode(geometry: marsGeometry) 116 117 marsNode.position = SCNVector3(2.5, 0, -3) 118 119 marsNode.runAction(SCNAction.repeatForever(SCNAction.rotateBy(x: 0, y: 20, z: 0, duration: 4))) 120 121 scene.rootNode.addChildNode(marsNode) 122 123 124 // 木星 125 let jupiterGeometry = SCNSphere(radius: 0.1) 126 127 let jupiterMaterial = SCNMaterial() 128 jupiterMaterial.diffuse.contents = UIImage(named: "jupiter") 129 130 jupiterGeometry.materials = [jupiterMaterial] 131 132 let jupiterNode = SCNNode(geometry: jupiterGeometry) 133 134 jupiterNode.position = SCNVector3(3, 0, -3) 135 136 jupiterNode.runAction(SCNAction.repeatForever(SCNAction.rotateBy(x: 0, y: 20, z: 0, duration: 4))) 137 138 scene.rootNode.addChildNode(jupiterNode) 139 140 141 // 金星 142 let saturnGeometry = SCNSphere(radius: 0.1) 143 144 let saturnMaterial = SCNMaterial() 145 saturnMaterial.diffuse.contents = UIImage(named: "saturn") 146 147 saturnGeometry.materials = [saturnMaterial] 148 149 let saturnNode = SCNNode(geometry: saturnGeometry) 150 151 saturnNode.position = SCNVector3(3.5, 0, -3) 152 153 saturnNode.runAction(SCNAction.repeatForever(SCNAction.rotateBy(x: 0, y: 20, z: 0, duration: 4))) 154 155 scene.rootNode.addChildNode(saturnNode) 156 157 158 159 160 161 // 海王星 162 let uranusGeometry = SCNSphere(radius: 0.03) 163 164 let uranusMaterial = SCNMaterial() 165 uranusMaterial.diffuse.contents = UIImage(named: "uranus") 166 167 uranusGeometry.materials = [uranusMaterial] 168 169 let uranusNode = SCNNode(geometry: uranusGeometry) 170 171 uranusNode.position = SCNVector3(4, 0, -3) 172 173 uranusNode.runAction(SCNAction.repeatForever(SCNAction.rotateBy(x: 0, y: 20, z: 0, duration: 4))) 174 175 scene.rootNode.addChildNode(uranusNode) 176 177 // 冥王星 178 let neputuneGeometry = SCNSphere(radius: 0.03) 179 180 let neputuneMaterial = SCNMaterial() 181 neputuneMaterial.diffuse.contents = UIImage(named: "neputune") 182 183 neputuneGeometry.materials = [neputuneMaterial] 184 185 let neputuneNode = SCNNode(geometry: neputuneGeometry) 186 187 neputuneNode.position = SCNVector3(4.5, 0, -3) 188 189 neputuneNode.runAction(SCNAction.repeatForever(SCNAction.rotateBy(x: 0, y: 20, z: 0, duration: 4))) 190 191 scene.rootNode.addChildNode(neputuneNode) 192 193// // 公転軸 194// let revolutionAxis = SCNNode() 195// 196// // 公転軸の位置を指定(太陽の中心位置と同じ) 197// revolutionAxis.position = SCNVector3(0, 0, -3) 198// 199// // 公転動作(sample2.swiftのdoRotationと同じ) 200// let revolution = doRotation(time: TimeInterval) 201// 202// revolutionAxis.runAction(revolution) 203// 204// revolutionAxis.addChildNode(mercuryNode) 205 206 207 208 209 210 // Set the scene to the view 211 sceneView.scene = scene 212 } 213 214 override func viewWillAppear(_ animated: Bool) { 215 super.viewWillAppear(animated) 216 217 // Create a session configuration 218 let configuration = ARWorldTrackingConfiguration() 219 220 // Run the view's session 221 sceneView.session.run(configuration) 222 } 223 224 override func viewWillDisappear(_ animated: Bool) { 225 super.viewWillDisappear(animated) 226 227 // Pause the view's session 228 sceneView.session.pause() 229 } 230 231 override func didReceiveMemoryWarning() { 232 super.didReceiveMemoryWarning() 233 // Release any cached data, images, etc that aren't in use. 234 } 235 236 // MARK: - ARSCNViewDelegate 237 238/* 239 // Override to create and configure nodes for anchors added to the view's session. 240 func renderer(_ renderer: SCNSceneRenderer, nodeFor anchor: ARAnchor) -> SCNNode? { 241 let node = SCNNode() 242 243 return node 244 } 245*/ 246 247 func session(_ session: ARSession, didFailWithError error: Error) { 248 // Present an error message to the user 249 250 } 251 252 func sessionWasInterrupted(_ session: ARSession) { 253 // Inform the user that the session has been interrupted, for example, by presenting an overlay 254 255 } 256 257 func sessionInterruptionEnded(_ session: ARSession) { 258 // Reset tracking and/or remove existing anchors if consistent tracking is required 259 260 } 261 262// // 動きはSCNActionで定義 263// func doRotation(time: TimeInterval) -> SCNAction { 264// let rotation = SCNAction.rotateBy(x: 0, y: CGFloat(Double(360) * .pi/180), z: 0, duration: time) 265// let foreverRotation = SCNAction.repeatForever(rotation) 266// return foreverRotation 267// } 268 269}

試したこと

Qiitaに投稿してくださっている
【入門】SwiftでARアプリ
を参考に、公転のコードをなんとかしようとしたのですが、私の力不足のため対応できませんでした・・・。

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

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

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

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

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

guest

回答1

0

ベストアンサー

該当のQiita記事とコードを比べてみると、わかると思いますが、「何に対してaddChildNodeしているか」が異なっています。

swift

1let revolutionAxis = SCNNode()

で公転の軸のnode(ここでいう太陽系全体のNode)を作って回転させます。

その子供として、惑星を追加していってください。

swift

1revolutionAxis.addChildNode(mercury)

のような感じです。

太陽系全体が回転しているのでその子供として座標をずらしながら惑星を追加していくと公転を表現できます。自転は、その惑星自身の回転アニメーションにより表現されています。もしその惑星にさらに子供のnodeを追加していけば、その惑星を中心とした公転も表現できます。

投稿2018/09/29 01:22

KBOY

総合スコア54

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問