8#ifndef DESIGNLAB_MATH_QUATERNION_H_
9#define DESIGNLAB_MATH_QUATERNION_H_
50 const float x_,
const float y_,
const float z_) :
74 return {
w + q.
w,
v + q.v };
78 return {
w - q.
w,
v - q.v };
86 return {
w * s,
v * s };
90 return {
w / s,
v / s };
101 return (
w < q.w) || (
w == q.w &&
v < q.v);
105 return other < *
this;
110 return !(*
this > other);
115 return !(*
this < other);
126 return w * other.w +
v.
Dot(other.v);
207 [[nodiscard]] std::string
ToString()
const;
224 std::basic_ostream<Char>& os,
const Quaternion& q)
237 return is >> unused >> q.
w >> unused >> q.
v;
266Quaternion
SlerpQuaternion(
const Quaternion& q1,
const Quaternion& q2,
float t);
std::string FloatingPointNumToString(const T num, const int digit=kDigit, const int width=kWidth)
小数を文字列に変換する関数. C++ では C のフォーマットのように %3.3f とかで小数を文字列に変換できないため自作する.
constexpr bool IsEqual(const T num1, const T num2) noexcept
C++において,小数同士の計算は誤差が出てしまう. 誤差込みで値が等しいか調べる.
constexpr Quaternion operator*(float s, const Quaternion &q)
Vector3 RotateVector3(const Vector3 &vec, const EulerXYZ &rot)
回転させたベクトルを返す.三角関数の処理が多く重たいので注意.
std::basic_istream< Char > & operator>>(std::basic_istream< Char > &is, EulerXYZ &r)
入力ストリーム
Quaternion SlerpQuaternion(const Quaternion &q1, const Quaternion &q2, const float t)
球面線形補間を行う.
std::basic_ostream< Char > & operator<<(std::basic_ostream< Char > &os, const EulerXYZ &r)
出力ストリーム.Csv形式で出力する.カンマ区切り.単位は [rad].
bool operator<=(const Quaternion &other) const noexcept
bool operator==(const Quaternion &q) const noexcept
constexpr float GetLengthSquared() const noexcept
クォータニオンの長さの2乗を返す(ノルムの2乗). クォータニオンの長さの2乗は,w^2 + x^2 + y^2 + z^2 で求められる.
constexpr Quaternion & operator=(const Quaternion &q)=default
コピー代入演算子.
Quaternion GetNormalized() const noexcept
正規化したクォータニオンを返す. クォータニオンの正規化とは,ノルムを1にすることを表す. クォータニオンqの正規化は,q / |q| で求められる.
constexpr Quaternion(const float w_, const Vector3 &v_)
スカラー成分とベクトル成分を指定して初期化する. ノルムが1になるように代入すること, 使用は非推奨,MakeByAngleAxisを使うこと.
bool operator>(const Quaternion &other) const noexcept
std::string ToString() const
クォータニオンを文字列に変換する. w, x, y, z の順で出力する.
void Normalize() noexcept
自身を正規化する.ノルムが1になる.
constexpr Quaternion(Quaternion &&q) noexcept=default
ムーブコンストラクタ.
constexpr Quaternion operator/(const float s) const
static Quaternion MakeByAngleAxis(float rad_angle, const Vector3 &axis)
回転軸と回転角からクォータニオンを作成する. q = cos(θ/2) * w + sin(θ/2) * { v.x + v.y + v.z } となる. ノルムは必ず1になる.
float GetNorm() const noexcept
クォータニオンのノルムを返す. ノルムとは,ベクトルの大きさのこと. クォータニオンのノルムは,w^2 + x^2 + y^2 + z^2 の平方根で求められる.
bool operator>=(const Quaternion &other) const noexcept
constexpr Quaternion ToLeftHandCoordinate() const noexcept
左手座標系への変換を行う. 言うまでもないが,機械工学では通例右手座標系を使う. しかし,dxlib は左手座標系なので,dxlib で描画するときは, この関数を使って左手座標系に変換する必要があ...
constexpr Quaternion GetConjugate() const noexcept
クォータニオンの共役を返す. 共役なクォータニオンとは,ベクトル成分の符号を反転させたもの q = w + xi + yj + zk とすると, qの共役は w - xi - yj - zk となる...
constexpr Quaternion operator+() const noexcept
constexpr Quaternion()
1 + {0,0,0}で初期化する,
constexpr Quaternion(const Quaternion &q)=default
コピーコンストラクタ.
constexpr Quaternion operator-() const noexcept
constexpr float GetDistanceSquared(const Quaternion &q) const noexcept
他のクォータニオンとの距離の2乗を返す. クォータニオンを4次元ベクトルとみなし,ベクトルの距離の2乗を求める.
bool operator<(const Quaternion &q) const noexcept
constexpr Quaternion operator*(const Quaternion &q) const noexcept
Quaternion GetInverse() const
クォータニオンの逆数を返す. クォータニオンqの逆数q^-1は,qの共役をノルムで割ったもの. q^-1 = q* / |q|^2
std::string ToCsvString() const
クォータニオンをCsv形式の文字列に変換する.カンマ区切り. w, x, y, z の順にカンマ区切りで出力する.
bool operator!=(const Quaternion &q) const noexcept
constexpr Quaternion(const float w_, const float x_, const float y_, const float z_)
スカラー成分とベクトル成分を指定して初期化する. ノルムが1になるように代入すること, 使用は非推奨,MakeByAngleAxisを使うこと.
constexpr float Dot(Quaternion other) const noexcept
クォータニオンの内積を返す. クォータニオンを4次元のベクトルとみなし,ベクトルの内積を求める.
constexpr Vector3 Cross(const Vector3 &other) const noexcept
自分×引数 の外積の結果を返す.
constexpr float Dot(const Vector3 &other) const noexcept
自分・引数 の内積の結果を返す.