teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

3

追記

2016/12/10 18:52

投稿

KSwordOfHaste
KSwordOfHaste

スコア18404

answer CHANGED
@@ -11,4 +11,13 @@
11
11
  1. interpolateの媒介変数を1.0より大きい数値まで用いる
12
12
  interpolateの仕様を正確にわかってないので使えるかどうか自信なしです。a,bの角度差が90度だとして、0~4.0まで変化させると1回転してくれたりしないでしょうか?
13
13
  2. 複数のキーフレームを設定し媒介変数の範囲によって異なるQuaternionを選び補完する
14
- 望むパスを通過するような180度未満のQuaternionを複数個用意し媒介変数の範囲によって補完する対象のQuaternionを切り替えます。こちらの方は確実にできると思います。
14
+ 望むパスを通過するような180度未満のQuaternionを複数個用意し媒介変数の範囲によって補完する対象のQuaternionを切り替えます。こちらの方は確実にできると思います。
15
+
16
+ ---
17
+ 追記:キーフレームの分割について
18
+ X,Y,Z軸それぞれの回転角度tx1,ty1,tz1とtx2,ty2,tz2のような形で初期状態と終了状態を指定するという考え方だと「実際に何回転させたいのか」がユーザにとって直感的にわかりにくいと思います。例えば、それぞれをdegree単位で0,0,0->360,360,360と指定したとして実際には何回転させたいのか自分には即座にピンときません。
19
+
20
+ それよりもQuaternionの考え方に従い「初期位置へQIで変換後、回転軸ax,ay,az(単位ベクトル)の周りにωだけ回転させるQr(ω)を施した位置が最終位置」という指定にしたほうが自然であるように思います。そういうやりかたにするとQr(ω)=(cos(ω/2),ax,ay,az)として決まりますしωが回転角そのものなのでキーフレーム間の回転をπ未満に抑えるためのキーフレームの分割数Dはceiling(ω/(π-ε))とすればよさそうです(εは理論上は0<ε<πであるような任意の値ということになりますが計算誤差を考えるとπ/4~π/2ぐらいがいいのかも知れません)。
21
+ キーフレーム#を初期状態=0、終了状態=Dとすると、各キーフレームの変換Q(i)は
22
+ Q(i)=QI・Qr(i・ω/D)
23
+ で計算できると思います。

2

文章がおかしいところを訂正

2016/12/10 18:52

投稿

KSwordOfHaste
KSwordOfHaste

スコア18404

answer CHANGED
@@ -10,5 +10,5 @@
10
10
 
11
11
  1. interpolateの媒介変数を1.0より大きい数値まで用いる
12
12
  interpolateの仕様を正確にわかってないので使えるかどうか自信なしです。a,bの角度差が90度だとして、0~4.0まで変化させると1回転してくれたりしないでしょうか?
13
- 2. 複数のキーフレームを設定し媒介変数の範囲によって異なる
13
+ 2. 複数のキーフレームを設定し媒介変数の範囲によって異なるQuaternionを選び補完する
14
14
  望むパスを通過するような180度未満のQuaternionを複数個用意し媒介変数の範囲によって補完する対象のQuaternionを切り替えます。こちらの方は確実にできると思います。

1

文章がおかしいところを訂正

2016/12/09 12:57

投稿

KSwordOfHaste
KSwordOfHaste

スコア18404

answer CHANGED
@@ -1,4 +1,4 @@
1
- 以前Quaternionの解説をよんで自分「こうなっているんじゃないか」という推測で書いてます。間違いがあったらご指摘いただければと思います。
1
+ 以前Quaternionの解説をよんで自分なりに「こうなっているんじゃないか」と理解したつもりの内容で(推測で書いてます。間違いがあったらご指摘いただければと思います。
2
2
 
3
3
  Quaternionの性質から任意の2つの補完は球面上の2点の最短距離に対する補完として計算されると思います。
4
4