2008年12月16日
回転の勉強っす(5)
ゴリゴリ計算するっすよ。
紙と鉛筆、それと何か飲み物あると良いかもっす。
準備は良いっすか?
気合の計算っすよ。
どうもぺんぎんっす( ◎v◎ )
もう一度関数部分を載せるっす。
///////////////////////
// The MIT Lisences
// Copyright (c) 2008 Naoya Bellic
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
///////////////////////
rotation pmEuler2Rot(vector vec)
{
rotation r;
float X = vec.x / 2.0;
float Y = vec.y / 2.0;
float Z = vec.z / 2.0;
r.x = llSin(X)*llCos(Y)*llCos(Z) + llCos(X)*llSin(Y)*llSin(Z);
r.y = llCos(X)*llSin(Y)*llCos(Z) - llSin(X)*llCos(Y)*llSin(Z);
r.z = llCos(X)*llCos(Y)*llSin(Z) + llSin(X)*llSin(Y)*llCos(Z);
r.s = llCos(X)*llCos(Y)*llCos(Z) - llSin(X)*llSin(Y)*llSin(Z);
return r;
}
計算する前に「きまり」の確認っす。
1.回転はZ軸→Y軸→X軸の順番
2.a + ib + jc + kd を<b, c, d, a>と表す。
rotationの表示は<(虚部),(実部)>の形っす。
計算していくっす。
オイラー角で<x, y, z> = <θ, φ, Ψ>のときを考えるっす。
まずは、1つの軸だけの回転っす。
Z軸の回転:<0, 0, sin(Ψ/2), cos(Ψ/2)>
Y軸の回転:<0, sin(φ/2), 0, cos(φ/2)>
X軸の回転:<sin(θ/2), 0, 0, cos(θ/2)>
こうなることはllEuler2Rotで実際にやってみると良いっす。
あとはZ→Y→Xの順番に掛け算するっす。
注意するのは、これが複素数の計算ってことっす。
「きまり」の2.っす。
i,j,kの性質っす。
ij = k = -ji
jk = i = -kj
ki = j = -ik
i2 = j2 = k2 = -1
これだけ分かれば計算できるっす。(たぶん)
順序を逆にすると符号が変わるっていうイヤラシさっす。
右から・左からが重要なわけっすね。
で、計算してみてくださいっす。
右に右にと掛け算していくっす。
i,j,kの性質を使ってまとめると上の関数の式になると思うっす。
(オマケ)「符号が全部入れ替わって出てくる」問題っす。
θ→θ±2π のとき X→X±π っす。
sin(X±π) = -sin(X)
cos(X±π) = -cos(X)
これが符号が入れ替わって出てくるタネっす。
Y,Zについても同様っす。
llEuler2Rotと同じ形じゃないと気持ち悪いっすから、
何か追加しないとっすね。
紙と鉛筆、それと何か飲み物あると良いかもっす。
準備は良いっすか?
気合の計算っすよ。
どうもぺんぎんっす( ◎v◎ )
もう一度関数部分を載せるっす。
///////////////////////
// The MIT Lisences
// Copyright (c) 2008 Naoya Bellic
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
///////////////////////
rotation pmEuler2Rot(vector vec)
{
rotation r;
float X = vec.x / 2.0;
float Y = vec.y / 2.0;
float Z = vec.z / 2.0;
r.x = llSin(X)*llCos(Y)*llCos(Z) + llCos(X)*llSin(Y)*llSin(Z);
r.y = llCos(X)*llSin(Y)*llCos(Z) - llSin(X)*llCos(Y)*llSin(Z);
r.z = llCos(X)*llCos(Y)*llSin(Z) + llSin(X)*llSin(Y)*llCos(Z);
r.s = llCos(X)*llCos(Y)*llCos(Z) - llSin(X)*llSin(Y)*llSin(Z);
return r;
}
計算する前に「きまり」の確認っす。
1.回転はZ軸→Y軸→X軸の順番
2.a + ib + jc + kd を<b, c, d, a>と表す。
rotationの表示は<(虚部),(実部)>の形っす。
計算していくっす。
オイラー角で<x, y, z> = <θ, φ, Ψ>のときを考えるっす。
まずは、1つの軸だけの回転っす。
Z軸の回転:<0, 0, sin(Ψ/2), cos(Ψ/2)>
Y軸の回転:<0, sin(φ/2), 0, cos(φ/2)>
X軸の回転:<sin(θ/2), 0, 0, cos(θ/2)>
こうなることはllEuler2Rotで実際にやってみると良いっす。
あとはZ→Y→Xの順番に掛け算するっす。
注意するのは、これが複素数の計算ってことっす。
「きまり」の2.っす。
i,j,kの性質っす。
ij = k = -ji
jk = i = -kj
ki = j = -ik
i2 = j2 = k2 = -1
これだけ分かれば計算できるっす。(たぶん)
順序を逆にすると符号が変わるっていうイヤラシさっす。
右から・左からが重要なわけっすね。
で、計算してみてくださいっす。
右に右にと掛け算していくっす。
i,j,kの性質を使ってまとめると上の関数の式になると思うっす。
(オマケ)「符号が全部入れ替わって出てくる」問題っす。
θ→θ±2π のとき X→X±π っす。
sin(X±π) = -sin(X)
cos(X±π) = -cos(X)
これが符号が入れ替わって出てくるタネっす。
Y,Zについても同様っす。
llEuler2Rotと同じ形じゃないと気持ち悪いっすから、
何か追加しないとっすね。
Ψは「ぷさい」って入れて変換すると出るっす。
他のはθ「しーた」,φ「ふぁい」っす
他のはθ「しーた」,φ「ふぁい」っす
Posted by ぺんぎん at 04:42│Comments(0)
│スクリプト