SceneKitでSCNNodeを生成し、SCNSceneに表示しているのですが、
回転のさせ方がイマイチわかりません。
具体的には、以下のrotation指定でなぜ回転しないのでしょうか。
また、wを0から1にすると回転しますが、なぜでしょうか。
swift
1let node = SCNNode() 2node.rotation = SCNVector4(x: 1.0, y: 1.0, z: 1.0, w: 0.0)
四元数、quaternion、axisなどの単語が存在していることは把握
していますが、理解しきれていないと思います。
わかりやすい解説資料などご存知であればお願いします。
私の理解では、例えば3つの角度指定(x,y,z)でドリルが指す方向を
指定し、4つ目(w)でドリルの回転を指定するのかと思っていましたが、
違いますでしょうか。
(上記の理解で正しければ、例えwが0でも回転するはずですが、しません)
追記
一晩経ったら少し理解できた気がしました。
物体の任意の回転は、自由な回転軸と回転量があれば
できる気がしました。
回転軸がx,y,zで回転量がwなのでしょうか。
誤りや解説等があればお願いします。
追記2
1日調べてようやく分かったような気がします。
SCNVector4とSCNQuaternionが同じものであるのは明らかにおかしい気がする。
以下のようになってしまっている。
swift
1typedef SCNVector4 SCNQuaternion;
仮にそうするとしても、SCNNodeのrotationの型がSCNQuaternionではなく
SCNVector4なのは変だ。
GLKit Frameworkの話になるが、GLKVector4とGLKQuaternionは
相互変換不可能ではないか?
GLKQuaternionの定義は以下のようになっている。あくまでGLKVector3とfloatの
構造であってGLKVector4とは関係がないのだ。(たまたまwという名称が一致しただけ)
swift
1typealias GLKQuaternion = _GLKQuaternion
objective
1union _GLKQuaternion { struct { GLKVector3 v; float s; }; struct { float x, y, z, w; }; float q[4]; } typedef union _GLKQuaternion GLKQuaternion;
SCNQuaternionのMultiplyが実装されていないのはこの辺りが背景にあるのか?
追記3
依頼に関して追記します。
SCNNodeのリファレンスはちゃんと読んでますか?
質問当初はあまり理解できていませんでしたが、今は少し理解できるようになりました。
なぜ、SCNQuaternionの話が出てきたのでしょうか?
以下に至った流れを書きます
このページに解説されている処理を読み替えながら行っています。
http://marupeke296.com/DXG_No16_AttitudeControl.html
- SCNNodeのrotationの型がSCNVector4になっている
- SCNVector4で目的の第1段階の回転に成功
- さらに複数のSCNVector4をMultiplyで合成したい(最終目的)
- SCNVector4にはMultiplyが実装されていない
- GLKQuaternionにはMultiplyが実装されているのでこちらを使う
- GLKQuaternionはどうやって作るのか調べる
- GLKVector4とGLKQuaternionは 相互変換不可能?別物では?
- では、SCNVector4とSCNQuaternionは相互変換できるのだろうか
- SCNVector4とSCNQuaternionは同じもの
- Vector4とQuaternionの使い分け基準がわからなくなる
という感じです。当初の質問からだいぶ離れてしまいましたね。
頃合いを見て解決済にしておきます。
回答2件
あなたの回答
tips
プレビュー