//====================================================================== // IrisQUAT.h // クォータニオンライブラリ // // Copyright (C) 2002-2003 NINTENDO Co.,Ltd. //====================================================================== #ifndef _IRIS_QUAT_H #define _IRIS_QUAT_H #ifdef __cplusplus extern "C" { #endif #include #include #include #define QM_S_SFT 14 // クォータニオンから行列への変換の精度調整定数 //---------------------------------------------------------------------- // 軸ベクトルと回転角からクォータニオンへの変換 // //・軸ベクトルと回転角から求めたクォータニオンをdstpが指すクォータニオンへ格納します。 // //・引数: // axisp 回転軸ベクトルのポインタ // theta 回転角度[256|1024|4096段階] // dstp クォータニオン格納バッファのポインタ // //・戻り値:なし //---------------------------------------------------------------------- #define VEC_Conv2Quat(axisp, theta, dstp) VEC_Conv2QuatPriv(SIN_NDIV_DEFAULT, axisp, theta, dstp) void VEC_Conv2Quat256(const Vec *axisp, u32 theta, Quat *dstp); void VEC_Conv2Quat1024(const Vec *axisp, u32 theta, Quat *dstp); void VEC_Conv2Quat4096(const Vec *axisp, u32 theta, Quat *dstp); // 中間マクロ(下記のマクロは直接使用しないで下さい) #define VEC_Conv2QuatPriv(ndiv, axisp, theta, dstp) VEC_Conv2QuatNDiv(ndiv, axisp, theta, dstp) #define VEC_Conv2QuatNDiv(ndiv, axisp, theta, dstp) VEC_Conv2Quat##ndiv( axisp, theta, dstp) //---------------------------------------------------------------------- // クォータニオンの内積 // //・2つのクォータニオンの内積を求めます。 // //・引数: // a 第1クォータニオンのポインタ // b 第2クォータニオンのポインタ // //・戻り値:内積 //---------------------------------------------------------------------- s32 QUAT_DotProduct(const Quat *a, const Quat *b); //---------------------------------------------------------------------- // クォータニオンの正規化 // //・srcpが指すクォータニオンを正規化してdstpが指すクォータニオンへ格納します。 // //・引数: // srcp 未正規化クォータニオンのポインタ // dstp 正規化クォータニオン格納バッファのポインタ // //・戻り値:なし // //※平方根演算器と除算器を使用するため、TCM上で実行したとしても // ディスプレイリスト等のDMA転送とシステムバス上で衝突した場合には // ストールしてしまいます。 //---------------------------------------------------------------------- void QUAT_Normalize(Quat *srcp, Quat *dstp); //---------------------------------------------------------------------- // クォータニオンの逆数(逆回転) // //・srcpが指すクォータニオンの逆数を求め、dstpが指すクォータニオンへ格納します。 // //・引数: // srcp 元のクォータニオンのポインタ // dstp 逆クォータニオン格納バッファのポインタ // //・戻り値:なし // //※除算器を使用するため、TCM上で実行したとしても // ディスプレイリスト等のDMA転送とシステムバス上で衝突した場合には // ストールしてしまいます。 //---------------------------------------------------------------------- void QUAT_Inverse(Quat *srcp, Quat *dstp); //---------------------------------------------------------------------- // クォータニオンの乗算 // //・2つのクォータニオンを乗算してaxbが指すクォータニオンへ格納します。 // //・引数: // a 第1クォータニオンのポインタ // b 第2クォータニオンのポインタ // axb 乗算クォータニオン格納バッファのポインタ // //・戻り値:なし //---------------------------------------------------------------------- void QUAT_Multiply(Quat *a, Quat *b, Quat *axb); //---------------------------------------------------------------------- // クォータニオンの加算 // //・2つのクォータニオンを加算した結果をa_bが指すクォータニオンへ格納します。 // //・引数: // a 第1クォータニオンのポインタ // b 第2クォータニオンのポインタ // a_b 加算後のクォータニオン格納バッファのポインタ // //・戻り値:なし //---------------------------------------------------------------------- void QUAT_Add(Quat *a, Quat *b, Quat *a_b); //---------------------------------------------------------------------- // クォータニオンの減算 // //・srcpが指すクォータニオンをスケーリングした結果をdstpが指すクォータニオンへ格納します。 // //・引数: // a 第1クォータニオンのポインタ // b 第2クォータニオンのポインタ // a_b 減算後のクォータニオン格納バッファのポインタ // //・戻り値:なし //---------------------------------------------------------------------- void QUAT_Sub(Quat *a, Quat *b, Quat *a_b); //---------------------------------------------------------------------- // クォータニオンのスケーリング // //・2つのクォータニオンをスケーリングした結果をa_bが指すクォータニオンへ格納します。 // //・引数: // srcp スケーリング前のクォータニオンのポインタ // dstp スケーリング後のクォータニオン格納バッファのポインタ // scale スケーリングパラメータ // //・戻り値:なし //---------------------------------------------------------------------- void QUAT_Scale(Quat *srcp, Quat *dstp, s32 scale); //---------------------------------------------------------------------- // クォータニオンの線形補間 // //・2つのクォータニオンを線形補間した結果をdが指すクォータニオンへ格納します。 // //・引数: // a 第1クォータニオンのポインタ // b 第2クォータニオンのポインタ // d 補間クォータニオン格納バッファのポインタ // t 補間パラメータ // //・戻り値:なし //---------------------------------------------------------------------- void QUAT_Lerp( Quat *p, Quat *q, Quat *d, s32 t); //---------------------------------------------------------------------- // クォータニオンの球面線形補間 // //・2つのクォータニオンを球面線形補間した結果をdが指すクォータニオンへ格納します。 // //・引数: // a 第1クォータニオンのポインタ // b 第2クォータニオンのポインタ // d 補間クォータニオン格納バッファのポインタ // t 補間パラメータ // //・戻り値:なし // //※除算器を使用するため、TCM上で実行したとしても // ディスプレイリスト等のDMA転送とシステムバス上で衝突した場合には // ストールしてしまいます。 //---------------------------------------------------------------------- void QUAT_Slerp(Quat *p, Quat *q, Quat *d, s32 t); #ifdef __cplusplus } // extern "C" #endif #endif // _IRIS_QUAT_H