クォータニオンは、簡単に2つの回転値をうまく補間することができ、オイラー角による補間で起きてしまうジンバルロックと方向反転を回避します。 クォータニオンは、オイラー角や軸回転といった回転マトリックスとの変換を簡単に行なうことができます。
クォータ二オンは、4つのfloat(x, y, z, w)のベクトルで表現されています。 3次元の回転は、ある軸を基準にある角度で回転させたものであり、 クォータニオンのその(x, y, z)の部分がその軸、wの部分がその角度を格納したものと考えることができます。
詳細は、 Wikipediaのクォータニオンのページ と クォータニオンと空間回転のページ を参照してください。
メソッド ¶
__init__()
3×3回転マトリックス, 4×4回転マトリックス, 軸基準の回転, オイラー角または(x, y, z, w)タプルからクォータニオンを構築することができます。 回転はユニットクォータニオン(つまり、長さが1のクォータニオン)として表現するので、任意の(x, y, z, w)タプルからクォータニオンを構築しても、 必ずしもユニットクォータニオンになるとは限らないことに注意してください。
# 回転マトリックスからクォータニオンを構築します。 hou.Quaternion(matrix3) hou.Quaternion(matrix4) # 任意の軸を基準とした回転からクォータニオンを構築します。 hou.Quaternion(90, (1, 1, 0)) # オイラー角からクォータニオンを構築します。 quaternion = hou.Quaternion() quaternion.setToEulerRotates((rx, ry, rz), rotate_order="xyz") # まず最初にマトリックスを構築することで、オイラー角からクォータニオンを構築する別の方法。 hou.Quaternion(hou.hmath.buildRotate((rx, ry, rz), "xyz")) # 特定のx, y, z, wの値を指定して、クォータニオンを構築します。 hou.Quaternion(x, y, z, w) # x, y, zを0に、wを1に設定してクォータニオンを構築します。 # このクォータニオンは単位行列クォータニオン(つまり、回転なし)に相当します。 hou.Quaternion()
hou.hmath.buildRotate, hou.hmath.buildRotateAboutAxis, hou.Matrix4.extractRotationMatrix3も参照してください。
extractRotationMatrix3()
→ hou.Matrix3
クォータニオンでの回転に相当する3×3回転マトリックスを返します。
hou.Matrix3の代わりにhou.Matrix4を作成したいのであれば、Matrix3からMatrix4を簡単に作成することができます:
hou.Matrix4(quaternion.extractRotationMatrix3())
クォータニオンがゼロのクォータニオンでも、このメソッドは例外を引き起こしません。 代わりに単位行列を返します。
hou.Quaternion.setToRotationMatrixも参照してください。
extractAngleAxis()
→ (float
, hou.Vector3)
クォータニオンでの回転に相当する軸回転での軸と回転を返します。 戻り値は、floatとhou.Vector3の2つを含んだタプルです。返される軸ベクトルは正規化されています。
このクォータニオンがゼロのクォータニオンなら、返される角度はゼロで、ベクトルはゼロベクトルです。 それ以外で、このクォータニオンが正規化されていない場合、その戻り値は、正規化されたクォータニオンで表現された回転に相当します。
hou.Quaternion.setToAngleAxisも参照してください。
extractEulerRotates(rotate_order="xyz")
→ hou.Vector3
クォータニオンでの回転に相当するオイラー回転(座標軸を基準とした単位が度のx, y, zの回転値)を返します。
このメソッドは以下のように実装することもできます:
def extractEulerRotates(self, rotate_order="xyz"): return hou.Matrix4(self.extractRotationMatrix3()).explode(rotate_order=rotate_order)["rotate"]
hou.Quaternion.setToEulerRotatesも参照してください。
rotate(vec)
→ hou.Vector3
指定したhou.Vector3をこのクォータニオンで回転させて、その結果を返します。
slerp(other, fraction)
→ hou.Quaternion
このクォータニオンと他のクォータニオン間で球面線型補間を実行して、新しいクォータニオンを返します。
fraction
は0.0から1.0までのfloatです。0.0はこのクォータニオン、1.0は他のクォータニオンを取得します。
このメソッドは、2つの異なった回転間を滑らかに補間するのに非常に役に立ちます。
詳細は、 WikipediaのSlerp のページを参照してください。
以下のサンプルは、2つのオイラー回転間を上手く補間します。
def interpolateEulerRotations(rotation1, rotation2, fraction, rotate_order="xyz"): quaternion1 = hou.Quaternion() quaternion1.setToEulerRotates(rotation1, rotate_order) quaternion2 = hou.Quaternion() quaternion2.setToEulerRotates(rotation2, rotate_order) return quaternion1.slerp(quaternion2, fraction).extractEulerRotates(rotate_order)
setToRotationMatrix(matrix3_or_matrix4)
このクォータニオンに、hou.Matrix3またはhou.Matrix4内のトランスフォームの回転コンポーネントを含めるように設定します。
hou.Quaternion.extractRotationMatrix3も参照してください。
setToAngleAxis(angle_in_deg, axis)
このクォータニオンに、指定した角度での軸回転を含めるように設定します。
angle_in_deg
の単位は度で、axis
は3つのfloatのシーケンスです。
このメソッドは以下のように実装することもできます:
def setToAngleAxis(self, angle_in_deg, axis): self.setToRotationMatrix( hou.hmath.buildRotateAboutAxis(axis, angle_in_deg))
hou.Quaternion.extractAngleAxisも参照してください。
setToVectors(a, b)
このクォータニオンを、hou.Vector3a
をベクトルb
へ回転させるクォータニオンに設定します。
setToEulerRotates(angles_in_deg, rotate_order="xyz")
このクォータニオンに、x,y,z座標軸を基準としたオイラー回転で指定された回転を含めるように設定します。
このメソッドは以下のように実装することもできます:
def setToEulerRotates(self, angles_in_deg, rotate_order="xyz"): self.setToRotationMatrix( hou.hmath.buildRotate(angles_in_deg, rotate_order))
hou.Quaternion.extractEulerRotatesとhou.hmath.buildRotateも参照してください。
setTo(tuple)
クォータニオンの4つのfloat値(x,y,z,w)を設定します。tuple
は必ず4つのfloatのシーケンスでなければなりません。
このメソッドは、既存のクォータニオンオブジェクトを修正します。 それらの4つの値から新しくクォータニオンを構築するには、hou.Quaternion.__init__を使用します。
hou.Quaternion.__setitem__も参照してください。
almostEqual(quaternion, tolerance=0.00001)
→ bool
廃止されました。代わりにQuaternion.isAlmostEqualを使用してください。
isAlmostEqual(quaternion, tolerance=0.00001)
→ bool
このクォータニオンが許容値の範囲内で他のクォータニオンと同じかどうか返します。
conjugate()
→ hou.Quaternion
このクォータニオンに保存されている回転と反対の回転を含んだクォータニオンを返します。 直感的には、ユニット長のクォータニオンに関しては、返されるクォータニオンには、反対方向を向いた軸で同じ角度だけ回転させた値が含まれます。
inverse()
→ hou.Quaternion
このクォータニオンの逆数を含んだクォータニオンを返します。
ユニットクォータニオンに関しては、その逆数はconjugate
(共役)と同じです。
hou.Quaternion.conjugateも参照してください。
normalized()
→ hou.Quaternion
このクォータニオンを正規化したバージョン(つまり、長さが1のクォータニオン)を返します。 回転を表現したクォータニオンは常に正規化されています。
長さがゼロまたはほぼゼロのクォータニオンを正規化すると、同じ値を持った新しいクォータニオンを返します。
このメソッドは以下のように実装されています(非ゼロ長のクォータニオンに対して):
def normalized(self): return self * (1.0 / self.length())
length()
→ float
クォータニオンの長さを返します。クォータニオンが回転を意味している時、その長さは1です。
クォータニオンの長さは、Vector4の長さ計算と同じです:
hou.Vector4(self).length()
dot(other)
→ float
このクォータニオンと他のクォータニオンとの内積を返します。
__getitem__(index)
→ float
クォータニオンに格納されている4つのfloat値の1つを返します。 このメソッドは、hou.Quaternion.__setitem__とhou.Quaternion.__len__を組み合わせることで、 クォータニオンに4つのfloatのシーケンスの挙動をさせるので、Pythonの大括弧表記、シーケンス反復などを使用することができます。
>>> q = hou.Quaternion(1, 2, 3, 4) >>> for value in q: ... print value 1 2 3 4 >>> q[2] 3 >>> len(q) 4
__setitem__(index, value)
クォータニオンに格納される4つのfloat値の1つを設定します。 詳細は、hou.Quaternion.__getitem__を参照してください。
__len__()
→ int
クォータニオン内のfloatエレメントの数4を返します。 詳細は、hou.Quaternion.__getitem__を参照してください。
__add__(quaternion)
→ hou.Quaternion
このクォータニオンと他のクォータニオンの加算を含んだ新しいクォータニオンを返します。
このメソッドにより、あなたはquaternion1 + quaternion2
と記述することができます。
2つのクォータニオンの加算は、それらのエレメントの1対1での加算を含んだベクトルとなるように定義されます。
__sub__(quaternion)
→ hou.Quaternion
このクォータニオンから他のクォータニオンを減算した結果を含んだ新しいクォータニオンを返します。
このメソッドにより、あなたはquaternion1 - quaternion2
と記述することができます。
__mul__(quaternion_or_scalar)
→ hou.Quaternion
このクォータニオンを他のクォータニオンまたはスカラーで乗算します。
このメソッドにより、あなたはquaternion1 * quaternion2
やquaternion * scalar
と記述することができます。
このメソッドは、新しいhou.Quaternionを返し、このオブジェクトの値を変更しません。
2つのクォータニオンの積は、それらのエレメントの1対1での積を含んだベクトルとなるように定義されます。 クォータニオンをスカラーで乗算すると、各エレメントがそのスカラーで乗算されます。