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

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

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

OpenGLは、プラットフォームから独立した、デスクトップやワークステーション、モバイルサービスで使用可能な映像処理用のAPIです。

Swift

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

3DCG

コンピュータの演算により、3次元空間の仮想物体を、2次元平面上で表現する手法である。

Q&A

解決済

2回答

5591閲覧

SCNNodeの向き(rotation)指定方法

退会済みユーザー

退会済みユーザー

総合スコア0

OpenGL

OpenGLは、プラットフォームから独立した、デスクトップやワークステーション、モバイルサービスで使用可能な映像処理用のAPIです。

Swift

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

3DCG

コンピュータの演算により、3次元空間の仮想物体を、2次元平面上で表現する手法である。

2グッド

1クリップ

投稿2016/01/14 13:56

編集2016/01/21 05:49

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;

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の使い分け基準がわからなくなる

という感じです。当初の質問からだいぶ離れてしまいましたね。
頃合いを見て解決済にしておきます。

otokichi_, ikuwow👍を押しています

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

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

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

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

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

Stripe

2016/01/15 19:25

なぜ、SCNQuaternionの話が出てきたのでしょうか?関係ないのでは?あと、SCNNodeのリファレンスはちゃんと読んでますか?
退会済みユーザー

退会済みユーザー

2016/01/16 05:33 編集

本文を更新しました。
guest

回答2

0

ベストアンサー

SCNNodeのリファレンスに書いてある通り、rotationに渡す値は、「最初の3つで回転軸を表し、4番目の値で回転角(単位はラジアン)を表します。」となっています。
rotationの値がSCNVector4型であることには、あまりこだわらないでください。
これは、ただ単純に値が4つ必要だったので、適当にSCNVector4型が選ばれただけです。言い換えるとrotationのための特別な型は用意していない。という意味です。
また、複数のrotation値を合成する関数も用意されていませんので、代わりにtransform値を合成してください。

投稿2016/01/16 05:43

Stripe

総合スコア2183

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

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

退会済みユーザー

退会済みユーザー

2016/01/16 05:51 編集

ありがとうございました。 自分の理解に自信が持てず、誰かに後押ししていただきたい状況でした。 > 複数のrotation値を合成する関数も用意されていませんので、代わりにtransform値を合成してください。 こちら、GLKQuaternionを使用してMultiplyする方法とどちらが良いでしょうか。 (コメント内質問で申し訳ない) そもそもそれでは駄目なのでしょうか・・・。
Stripe

2016/01/16 05:53

transformはSCNMatrix4型ですよ。
退会済みユーザー

退会済みユーザー

2016/01/16 06:18

すいません。もう少し詳しく書きます。 このページに解説されている処理を行っています。 http://marupeke296.com/DXG_No16_AttitudeControl.html 平面に立たせるまでは良かったのですが、思うように向きを変えてくれません。 GLKit Frameworkには以下のように関数があるので、これを駆使しようと考えました。 自前でやったほうが確実でしょうか。 ・GLKQuaternionConjugate ・GLKQuaternionMultiply
Stripe

2016/01/16 07:10

そのページに書いてある通り、Matrix型の値を求めるのが最終的な目標です。 その計算の過程でQuaternion型を利用しているのです。 Quaternion型を使わずに、直接Matrix型で計算しても同じ結果になります。
退会済みユーザー

退会済みユーザー

2016/01/16 08:04

ありがとうございます。いろいろ試してみます。
guest

0

投稿2016/01/15 04:07

fuzzball

総合スコア16731

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

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

退会済みユーザー

退会済みユーザー

2016/01/15 04:56 編集

すいません。リンクになっていたのですね。 参照します。ありがとうございます。 うーーん、なんとなくわかってきました。 本来のwの意味は「そもそも「w」って何なのか?」で 提示いただいた意味のようですが、今回はそれを rotation(回転)に代入しようとしています。 rotation(回転)ではwを別の意味で利用しているように 思えます。 そもそもrotationの型がSCNVector4であることが微妙な 仕様に感じました。 違いますかね・・・。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問