nlib
nn::nlib::simd::Vector3 クラス

3次元ベクトルの計算を行う関数が集められたクラスです。全ての関数でレーン3に設定された値は無視されます。 [詳解]

#include "nn/nlib/simd/SimdVector3.h"

静的公開メンバ関数

static bool IsNaN (SimdVectorArg vec) noexcept
 vec のいずれかの要素がNaNであるかどうかを検証します。 [詳解]
 
static bool IsInfinite (SimdVectorArg vec) noexcept
 vec のいずれかの要素が正か負の無限大になっているかどうかを検証します。 [詳解]
 
static bool InBound (SimdVectorArg vec, SimdVectorArg bounds) noexcept
 vec の要素がbounds の境界内であるかどうかを検証します。 [詳解]
 
static f128 Dot (SimdVectorArg vec1, SimdVectorArg vec2) noexcept
 3次元ベクトル間の内積を計算します。 [詳解]
 
template<bool SetLane0, bool SetLane1, bool SetLane2, bool SetLane3>
static f128 DotEx (SimdVectorArg vec1, SimdVectorArg vec2) noexcept
 3次元ベクトル間の内積を計算して、各レーンに設定します。 [詳解]
 
static SimdVector Cross (SimdVectorArg vec1, SimdVectorArg vec2) noexcept
 3次元ベクトル間の外積を計算します。 [詳解]
 
static SimdVector Normalize (SimdVectorArg vec) noexcept
 3次元ベクトルを正規化します。 [詳解]
 
static SimdVector NormalizeEst (SimdVectorArg vec) noexcept
 3次元ベクトルを相対的に低い精度で正規化します。 [詳解]
 
static float Normalize (SimdVector *normalized, SimdVectorArg vec) noexcept
 3次元ベクトルを正規化します。 [詳解]
 
static float NormalizeEst (SimdVector *normalized, SimdVectorArg vec) noexcept
 3次元ベクトルを相対的に低い精度で正規化します。 [詳解]
 
static f128 LengthSq (SimdVectorArg vec) noexcept
 3次元ベクトルの長さの2乗を計算します。 [詳解]
 
static f128 Length (SimdVectorArg vec) noexcept
 3次元ベクトルの長さを計算します。 [詳解]
 
static f128 LengthEst (SimdVectorArg vec) noexcept
 3次元ベクトルの長さを相対的に低い精度で計算します。 [詳解]
 
static f128 RecpLength (SimdVectorArg vec) noexcept
 3次元ベクトルの長さの逆数を計算します。 [詳解]
 
static f128 RecpLengthEst (SimdVectorArg vec) noexcept
 3次元ベクトルの長さの逆数を相対的に低い精度で計算します。 [詳解]
 
static f128 GetAngle (SimdVectorArg vec1_normalized, SimdVectorArg vec2_normalized) noexcept
 正規化された2つの3次元ベクトル間の角度(ラジアン)を計算します。 [詳解]
 
static SimdVector Reflect (SimdVectorArg vec, SimdVectorArg normal) noexcept
 3次元の法線ベクトルによって3次元ベクトルを反射します。 [詳解]
 
static SimdVector Transform (SimdVectorArg vec, SimdMatrixArg m) noexcept
 行列により3次元ベクトルを変換します(レーン3(w要素)を1として計算します)。 [詳解]
 
static SimdVector TransformCoord (SimdVectorArg vec, SimdMatrixArg m) noexcept
 行列により3次元ベクトルを変換します(レーン3(w要素)を1として計算します)。 [詳解]
 
static SimdVector TransformNormal (SimdVectorArg vec, SimdMatrixArg m) noexcept
 行列により3次元ベクトルを変換します(レーン3(w要素)を0として計算します)。 [詳解]
 
static SimdVector Rotate (SimdVectorArg vec, SimdQuaternionArg q_normalized) noexcept
 クォータニオンを使ってベクトルを回転させます。 [詳解]
 
static SimdVector InvRotate (SimdVectorArg vec, SimdQuaternionArg q_normalized) noexcept
 クォータニオンを使ってベクトルを逆回転させます。 [詳解]
 
ロードとストア
static SimdVector LoadFloat3 (const Float3 *p) noexcept
 メモリから3次元ベクトルを読み込みます [詳解]
 
template<typename MyVector3 >
static SimdVector LoadFloat3 (const MyVector3 *p) noexcept
 メモリから3次元ベクトルを読み込みます [詳解]
 
static void StoreFloat3 (Float3 *p, SimdVectorArg vec) noexcept
 3次元ベクトルをメモリに書き込みます [詳解]
 
template<typename MyVector3 >
static void StoreFloat3 (MyVector3 *p, SimdVectorArg vec) noexcept
 3次元ベクトルをメモリに書き込みます [詳解]
 
比較
static bool CmpEq (SimdVectorArg vec1, SimdVectorArg vec2) noexcept
 2つの3次元ベクトルが等しいかどうか比較します。 [詳解]
 
static bool CmpLt (SimdVectorArg vec1, SimdVectorArg vec2) noexcept
 vec1 の全ての要素がvec2 の対応する要素よりも小さいかどうか比較します。 [詳解]
 
static bool CmpLe (SimdVectorArg vec1, SimdVectorArg vec2) noexcept
 vec1 の全ての要素がvec2 の対応する要素以下かどうか比較します。 [詳解]
 
static bool CmpGt (SimdVectorArg vec1, SimdVectorArg vec2) noexcept
 vec1 の全ての要素がvec2 の対応する要素よりも大きいかどうか比較します。 [詳解]
 
static bool CmpGe (SimdVectorArg vec1, SimdVectorArg vec2) noexcept
 vec1 の全ての要素がvec2 の対応する要素以上かどうか比較します。 [詳解]
 
static bool CmpNe (SimdVectorArg vec1, SimdVectorArg vec2) noexcept
 vec1vec2 が等しくないかどうか比較します。 [詳解]
 
static bool CmpNearEq (SimdVectorArg vec1, SimdVectorArg vec2, SimdVectorArg eps) noexcept
 vec1vec2 がほぼ等しいかどうか比較します。 [詳解]
 

詳解

3次元ベクトルの計算を行う関数が集められたクラスです。全ての関数でレーン3に設定された値は無視されます。

説明
全て静的メンバ関数によって構成されています。 それぞれの要素が独立に計算される処理については、F128クラスに実装されている関数を使うことができる場合があります。
SSEやNEONがサポートされていない環境でも利用することができますが、パフォーマンスは最適なものではありません。
このクラスのメンバは全て静的関数で、クラスをインスタンス化することはできません。

SimdVector3.h13 行目に定義があります。

関数詳解

§ CmpEq()

nn::nlib::simd::Vector3::CmpEq ( SimdVectorArg  vec1,
SimdVectorArg  vec2 
)
staticnoexcept

2つの3次元ベクトルが等しいかどうか比較します。

引数
[in]vec13次元ベクトル
[in]vec23次元ベクトル
戻り値
ベクトルの要素がそれぞれ同じ場合はtrue, そうでなければfalse

§ CmpGe()

nn::nlib::simd::Vector3::CmpGe ( SimdVectorArg  vec1,
SimdVectorArg  vec2 
)
staticnoexcept

vec1 の全ての要素がvec2 の対応する要素以上かどうか比較します。

引数
[in]vec13次元ベクトル
[in]vec23次元ベクトル
戻り値
vec1vec2 以上の場合はtrue, そうでなければfalse

§ CmpGt()

nn::nlib::simd::Vector3::CmpGt ( SimdVectorArg  vec1,
SimdVectorArg  vec2 
)
staticnoexcept

vec1 の全ての要素がvec2 の対応する要素よりも大きいかどうか比較します。

引数
[in]vec13次元ベクトル
[in]vec23次元ベクトル
戻り値
vec1vec2 よりも大きい場合はtrue, そうでなければfalse

§ CmpLe()

nn::nlib::simd::Vector3::CmpLe ( SimdVectorArg  vec1,
SimdVectorArg  vec2 
)
staticnoexcept

vec1 の全ての要素がvec2 の対応する要素以下かどうか比較します。

引数
[in]vec13次元ベクトル
[in]vec23次元ベクトル
戻り値
vec1vec2 以下の場合はtrue, そうでなければfalse

§ CmpLt()

nn::nlib::simd::Vector3::CmpLt ( SimdVectorArg  vec1,
SimdVectorArg  vec2 
)
staticnoexcept

vec1 の全ての要素がvec2 の対応する要素よりも小さいかどうか比較します。

引数
[in]vec13次元ベクトル
[in]vec23次元ベクトル
戻り値
vec1vec2 よりも小さい場合はtrue, そうでなければfalse

§ CmpNe()

nn::nlib::simd::Vector3::CmpNe ( SimdVectorArg  vec1,
SimdVectorArg  vec2 
)
staticnoexcept

vec1vec2 が等しくないかどうか比較します。

引数
[in]vec13次元ベクトル
[in]vec23次元ベクトル
戻り値
vec1vec2 と等しくない場合はtrue, そうでなければfalse

§ CmpNearEq()

nn::nlib::simd::Vector3::CmpNearEq ( SimdVectorArg  vec1,
SimdVectorArg  vec2,
SimdVectorArg  eps 
)
staticnoexcept

vec1vec2 がほぼ等しいかどうか比較します。

引数
[in]vec13次元ベクトル
[in]vec23次元ベクトル
[in]eps許容値
戻り値
vec1vec2 がほぼ等しい場合はtrue, そうでなければfalse
説明
以下のような処理になります。
return abs(vec1[0] - vec2[0]) <= eps[0] &&
abs(vec1[1] - vec2[1]) <= eps[1] &&
abs(vec1[2] - vec2[2]) <= eps[2];

§ Cross()

nn::nlib::simd::Vector3::Cross ( SimdVectorArg  vec1,
SimdVectorArg  vec2 
)
staticnoexcept

3次元ベクトル間の外積を計算します。

引数
[in]vec13次元ベクトル
[in]vec23次元ベクトル
戻り値
外積となる3次元ベクトル

§ Dot()

nn::nlib::simd::Vector3::Dot ( SimdVectorArg  vec1,
SimdVectorArg  vec2 
)
staticnoexcept

3次元ベクトル間の内積を計算します。

引数
[in]vec13次元ベクトル
[in]vec23次元ベクトル
戻り値
レーン3を含む各レーンに内積が格納されます。

§ DotEx()

template<bool SetLane0, bool SetLane1, bool SetLane2, bool SetLane3>
nn::nlib::simd::Vector3::DotEx ( SimdVectorArg  vec1,
SimdVectorArg  vec2 
)
staticnoexcept

3次元ベクトル間の内積を計算して、各レーンに設定します。

テンプレート引数
SetLane0trueの場合レーン0に内積が、falseの場合0が格納されます。
SetLane1trueの場合レーン1に内積が、falseの場合0が格納されます。
SetLane2trueの場合レーン2に内積が、falseの場合0が格納されます。
SetLane3trueの場合レーン3に内積が、falseの場合0が格納されます。
引数
[in]vec13次元ベクトル
[in]vec23次元ベクトル
戻り値
テンプレートパラメータに指定した値によって、各要素に内積か0.fかが格納されます。
説明
以下のような擬似コードで示される処理を行います。
float dot = vec1[0] * vec2[0] + vec1[1] * vec2[1] + vec1[2] * vec2[2];
ret[0] = SetLane0 ? dot : 0.f;
ret[1] = SetLane1 ? dot : 0.f;
ret[2] = SetLane2 ? dot : 0.f;
ret[3] = SetLane3 ? dot : 0.f;
return ret;

§ GetAngle()

nn::nlib::simd::Vector3::GetAngle ( SimdVectorArg  vec1_normalized,
SimdVectorArg  vec2_normalized 
)
staticnoexcept

正規化された2つの3次元ベクトル間の角度(ラジアン)を計算します。

引数
[in]vec1_normalized正規化された3次元ベクトル
[in]vec2_normalized正規化された3次元ベクトル
戻り値
各レーンに3次元ベクトル間の角度(ラジアン)が格納されます。

§ InBound()

nn::nlib::simd::Vector3::InBound ( SimdVectorArg  vec,
SimdVectorArg  bounds 
)
staticnoexcept

vec の要素がbounds の境界内であるかどうかを検証します。

引数
[in]vec3次元ベクトル
[in]bounds境界となる3次元のボックス
戻り値
境界内にあればtrue, そうでなければfalse
説明
以下のような処理になります。
return abs(vec[0]) <= bounds[0] &&
abs(vec[1]) <= bounds[1] &&
abs(vec[2]) <= bounds[2];

§ InvRotate()

nn::nlib::simd::Vector3::InvRotate ( SimdVectorArg  vec,
SimdQuaternionArg  q_normalized 
)
staticnoexcept

クォータニオンを使ってベクトルを逆回転させます。

引数
[in]vec回転させるベクトル
[in]q_normalized正規化されたクォータニオン
戻り値
回転後のベクトル

§ IsInfinite()

nn::nlib::simd::Vector3::IsInfinite ( SimdVectorArg  vec)
staticnoexcept

vec のいずれかの要素が正か負の無限大になっているかどうかを検証します。

引数
[in]vec3次元ベクトル
戻り値
vec のいずれかの要素が無限大であればtrue, そうでなければfalse

§ IsNaN()

nn::nlib::simd::Vector3::IsNaN ( SimdVectorArg  vec)
staticnoexcept

vec のいずれかの要素がNaNであるかどうかを検証します。

引数
[in]vec3次元ベクトル
戻り値
vec のいずれかの要素がNaNであればtrue, そうでなければfalse

§ Length()

nn::nlib::simd::Vector3::Length ( SimdVectorArg  vec)
staticnoexcept

3次元ベクトルの長さを計算します。

引数
[in]vec3次元ベクトル
戻り値
各レーンに長さが格納されます。

§ LengthEst()

nn::nlib::simd::Vector3::LengthEst ( SimdVectorArg  vec)
staticnoexcept

3次元ベクトルの長さを相対的に低い精度で計算します。

引数
[in]vec3次元ベクトル
戻り値
各レーンに長さが格納されます。

§ LengthSq()

nn::nlib::simd::Vector3::LengthSq ( SimdVectorArg  vec)
staticnoexcept

3次元ベクトルの長さの2乗を計算します。

引数
[in]vec3次元ベクトル
戻り値
各レーンに長さの2乗が格納されます。

§ LoadFloat3() [1/2]

nn::nlib::simd::Vector3::LoadFloat3 ( const Float3 p)
staticnoexcept

メモリから3次元ベクトルを読み込みます

引数
[in]p3次元ベクトルが格納されているポインタ
戻り値
3次元ベクトル(w要素の値は不定)

§ LoadFloat3() [2/2]

template<typename MyVector3 >
nn::nlib::simd::Vector3::LoadFloat3 ( const MyVector3 *  p)
staticnoexcept

メモリから3次元ベクトルを読み込みます

テンプレート引数
MyVector3float型のx, y, zという名前の公開データメンバを連続した領域に持つ構造体
引数
[in]p3次元ベクトルが格納されているポインタ
戻り値
3次元ベクトル(w要素の値は不定)
説明
MyVector3は例えばDirectXのXMFLOAT3, XMFLOAT3Aのようなクラスになります。

§ Normalize() [1/2]

nn::nlib::simd::Vector3::Normalize ( SimdVectorArg  vec)
staticnoexcept

3次元ベクトルを正規化します。

引数
[in]vec3次元ベクトル
戻り値
正規化された3次元ベクトル
説明
vec の長さが無限大の場合は各要素がNaNのベクトルを、長さが0の場合は0ベクトルを返します。

§ Normalize() [2/2]

nn::nlib::simd::Vector3::Normalize ( SimdVector normalized,
SimdVectorArg  vec 
)
staticnoexcept

3次元ベクトルを正規化します。

引数
[out]normalized正規化された3次元ベクトル
[in]vec3次元ベクトル
戻り値
vecの長さの2乗

§ NormalizeEst() [1/2]

nn::nlib::simd::Vector3::NormalizeEst ( SimdVectorArg  vec)
staticnoexcept

3次元ベクトルを相対的に低い精度で正規化します。

引数
[in]vec3次元ベクトル
戻り値
正規化された3次元ベクトル

§ NormalizeEst() [2/2]

nn::nlib::simd::Vector3::NormalizeEst ( SimdVector normalized,
SimdVectorArg  vec 
)
staticnoexcept

3次元ベクトルを相対的に低い精度で正規化します。

引数
[out]normalized正規化された3次元ベクトル
[in]vec3次元ベクトル
戻り値
vecの長さの2乗

§ RecpLength()

nn::nlib::simd::Vector3::RecpLength ( SimdVectorArg  vec)
staticnoexcept

3次元ベクトルの長さの逆数を計算します。

引数
[in]vec3次元ベクトル
戻り値
各レーンに長さの逆数が格納されます。

§ RecpLengthEst()

nn::nlib::simd::Vector3::RecpLengthEst ( SimdVectorArg  vec)
staticnoexcept

3次元ベクトルの長さの逆数を相対的に低い精度で計算します。

引数
[in]vec3次元ベクトル
戻り値
各レーンに長さの逆数が格納されます。

§ Reflect()

nn::nlib::simd::Vector3::Reflect ( SimdVectorArg  vec,
SimdVectorArg  normal 
)
staticnoexcept

3次元の法線ベクトルによって3次元ベクトルを反射します。

引数
[in]vec反射される3次元ベクトル
[in]normal3次元法線ベクトル(単位ベクトル)
戻り値
反射された3次元ベクトルを返します。

§ Rotate()

nn::nlib::simd::Vector3::Rotate ( SimdVectorArg  vec,
SimdQuaternionArg  q_normalized 
)
staticnoexcept

クォータニオンを使ってベクトルを回転させます。

引数
[in]vec回転させるベクトル
[in]q_normalized正規化されたクォータニオン
戻り値
回転後のベクトル

§ StoreFloat3() [1/2]

nn::nlib::simd::Vector3::StoreFloat3 ( Float3 p,
SimdVectorArg  vec 
)
staticnoexcept

3次元ベクトルをメモリに書き込みます

引数
[in,out]p3次元ベクトルが格納されるポインタ
[in]vec3次元ベクトル(w要素はメモリに格納されない)

§ StoreFloat3() [2/2]

template<typename MyVector3 >
nn::nlib::simd::Vector3::StoreFloat3 ( MyVector3 *  p,
SimdVectorArg  vec 
)
staticnoexcept

3次元ベクトルをメモリに書き込みます

テンプレート引数
MyVector3float型のx, y, zという名前の公開データメンバを連続した領域に持つ構造体
引数
[in,out]p3次元ベクトルが格納されるポインタ
[in]vec3次元ベクトル(w要素はメモリに格納されない)
説明
MyVector3は例えばDirectXのXMFLOAT3, XMFLOAT3Aのようなクラスになります。

§ Transform()

nn::nlib::simd::Vector3::Transform ( SimdVectorArg  vec,
SimdMatrixArg  m 
)
staticnoexcept

行列により3次元ベクトルを変換します(レーン3(w要素)を1として計算します)。

引数
[in]vec3次元ベクトル
[in]m変換行列
戻り値
変換された4次元ベクトル
説明
vec のレーン3(w要素)は1であるとして計算が行われます。計算結果のベクトルは同時座標系にない(レーン3(w要素)は1.0ではない)かもしれません。

§ TransformCoord()

nn::nlib::simd::Vector3::TransformCoord ( SimdVectorArg  vec,
SimdMatrixArg  m 
)
staticnoexcept

行列により3次元ベクトルを変換します(レーン3(w要素)を1として計算します)。

引数
[in]vec3次元ベクトル
[in]m変換行列
戻り値
変換された4次元ベクトル(同次ベクトル)
説明
vec のレーン3(w要素)は1であるとして計算が行われます。計算結果のベクトルは同時座標系にあり(レーン3(w要素)は1.0)ます。

§ TransformNormal()

nn::nlib::simd::Vector3::TransformNormal ( SimdVectorArg  vec,
SimdMatrixArg  m 
)
staticnoexcept

行列により3次元ベクトルを変換します(レーン3(w要素)を0として計算します)。

引数
[in]vec3次元ベクトル
[in]m変換行列
戻り値
変換された3次元ベクトル

このクラス詳解は次のファイルから抽出されました: