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

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

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

Q&A

解決済

1回答

1310閲覧

SWIFTUI で motion sensor 値で sceneKit を回転させる

sugidodan

総合スコア26

0グッド

0クリップ

投稿2021/09/18 02:54

編集2021/09/18 03:46

標記はSwiftで動作を確認しました。

UIViewRepresentableのupdateUIViewで
uiViewから
Node.eulerAngles
を変更すれば良いでしょうか?

原因は
UIViewRepresentableのupdateUIViewで角度を変更しても、再描画されない
からと考えています。
makeUIViewに角度の値は正しく渡せています。
再描画させるための命令文などが必要でしょうか?
角度を設定する
.eulerAnglesがよくないでしょうか?

func updateUIView(_ uiView: UIViewType, context: Context){ Node.eulerAngles = SCNVector3(x: Float(self.pitch), y: Float(self.azimuth), z: Float(self.roll)) print(self.pitch,self.azimuth,self.roll) }

以下、一部抜粋

struct WrappedSceneKitView: UIViewRepresentable { @Binding var pitch:Double @Binding var azimuth:Double @Binding var roll:Double var scene = SCNScene() var scnView = SCNView() var Node = SCNNode() init(pitch:Binding<Double>,azimuth:Binding<Double>,roll:Binding<Double>){ _roll = roll _pitch = pitch _azimuth = azimuth } func makeUIView(context: Context) -> SCNView { scnView.backgroundColor = UIColor.white scnView.allowsCameraControl = false scnView.showsStatistics = false scnView.scene = scene // Adding a camera to a scene let cameraNode = SCNNode() cameraNode.camera = SCNCamera() cameraNode.position = SCNVector3(x: 0, y: 1.5, z: 5) scene.rootNode.addChildNode(cameraNode) // Adding an omnidirectional light source to the scene let omniLight = SCNLight() omniLight.type = .omni let omniLightNode = SCNNode() omniLightNode.light = omniLight omniLightNode.position = SCNVector3(x: 0, y: 10, z: 10) scene.rootNode.addChildNode(omniLightNode) // Adding a light source to your scene that illuminates from all directions. let ambientLight = SCNLight() ambientLight.type = .ambient ambientLight.color = UIColor.darkGray let ambientLightNode = SCNNode() ambientLightNode.light = ambientLight scene.rootNode.addChildNode(ambientLightNode) // Adding a cube(face) to a scene let orign:SCNGeometry = SCNCylinder(radius: 0.75, height: 0.75) Node.geometry = orign Node.position = SCNVector3(x:0.0,y:0.0,z:0.0) Node.eulerAngles = SCNVector3(x: Float(pitch), y: Float(azimuth), z: Float(roll)) scene.rootNode.addChildNode(Node) return scnView } func makeUIView(context: Context) -> SCNView {func updateUIView(_ uiView: UIViewType, context: Context){ Node.eulerAngles = SCNVector3(x: Float(self.pitch), y: Float(self.azimuth), z: Float(self.roll)) }
import SwiftUI import SceneKit struct ContentView: View { @ObservedObject var sensor = MotionSensor() var body: some View { WrappedSceneKitView(pitch:$sensor.pitch,azimuth:$sensor.azimuth,roll: $senror.roll)

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

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

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

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

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

guest

回答1

0

自己解決

案2
チカチカしなくなりました。
回転させたいchildNodesが[3]の場合

func updateUIView(_ uiView: UIViewType, context: Context){ uiView.scene?.rootNode.childNodes[3].eulerAngles = SCNVector3(x: Float(self.pitch), y: Float(self.azimuth), z: Float(self.roll)) }

案1
チカチカします。

func makeUIView(context: Context) -> SCNView { let scnView = SCNView() self.setup(scnView) return scnView } func setup(_ scnView: SCNView){ let scene = SCNScene() scnView.scene = scene . . . scene.rootNode.addChildNode(cubeNode)   } func updateUIView(_ uiView: UIViewType, context: Context){ self.setup(uiView) } }

投稿2021/09/18 03:36

編集2021/09/18 04:25
sugidodan

総合スコア26

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

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

sugidodan

2021/09/18 04:25

さらに良い方法があれば、コメントをお願いします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問