1 /*---------------------------------------------------------------------------* 2 Project: Horizon 3 File: ulcd_StereoCamera.h 4 5 Copyright (C)2010 Nintendo Co., Ltd. All rights reserved. 6 7 These coded instructions, statements, and computer programs contain 8 proprietary information of Nintendo of America Inc. and/or Nintendo 9 Company Ltd., and are protected by Federal copyright law. They may 10 not be disclosed to third parties or copied or duplicated in any form, 11 in whole or in part, without the prior written consent of Nintendo. 12 13 $Rev: 28083 $ 14 *---------------------------------------------------------------------------*/ 15 16 /*! @file 17 @brief StereoCamera に関するAPIの宣言 18 19 :include nn/ulcd.h 20 */ 21 22 #ifndef NN_ULCD_CTR_STEREO_CAMERA_H_ 23 #define NN_ULCD_CTR_STEREO_CAMERA_H_ 24 25 #include <nn/WithInitialize.h> 26 #include <nn/util/util_NonCopyable.h> 27 #include <nn/math.h> 28 29 namespace nn { 30 namespace ulcd { 31 namespace CTR { 32 33 /*! 34 @brief 両眼視差を考慮した絵を描画するためのカメラ行列作成をサポートするクラスです。 35 */ 36 class StereoCamera 37 { 38 public: 39 40 /*! 41 @brief 立体視のためのカメラ行列生成モジュールを構築します。初期化は行いません。 42 43 初期化を行わないため、別途、@ref Initialize を呼ぶ必要があります。 44 45 @return なし。 46 */ 47 StereoCamera(); 48 /*! 49 @brief 立体視のためのカメラ行列生成モジュールを構築し、初期化します。 50 51 @return なし。 52 */ 53 StereoCamera(const nn::WithInitialize&); 54 /*! 55 @brief 立体視のためのカメラ行列生成モジュールを破棄します。 56 57 内部で Finalize() を呼び出します。 58 59 @return なし。 60 */ 61 ~StereoCamera(); 62 63 /*! 64 @brief 立体視のためのカメラ行列生成モジュールの初期化を行います。 65 66 @return なし。 67 */ 68 void Initialize(void); 69 /*! 70 @brief 立体視のためのカメラ行列生成モジュールの終了処理を行います。 71 72 @return なし。 73 */ 74 void Finalize(void); 75 /*! 76 :overload matrix 77 78 @brief ベースカメラのビューボリュームを構成するパラメータを設定します。 79 80 @param[in] proj ベースカメラに対するプロジェクション行列 81 82 @return なし。 83 */ 84 void SetBaseFrustum(const nn::math::Matrix44 *proj); 85 /*! 86 :overload parameters 87 88 @brief ベースカメラのビューボリュームを構成するパラメータを設定します。 89 90 @param[in] left ベースカメラのビューボリュームにおけるニアクリップ面の左辺位置 91 @param[in] right ベースカメラのビューボリュームにおけるニアクリップ面の右辺位置 92 @param[in] bottom ベースカメラのビューボリュームにおけるニアクリップ面の下辺位置 93 @param[in] top ベースカメラのビューボリュームにおけるニアクリップ面の上辺位置 94 @param[in] near ベースカメラのビューボリュームにおけるニアクリップ面までの距離 95 @param[in] far ベースカメラのビューボリュームにおけるファークリップ面までの距離 96 97 @return なし。 98 */ 99 void SetBaseFrustum(const f32 left, const f32 right, const f32 bottom, const f32 top, const f32 near, const f32 far); 100 /*! 101 :overload matrix 102 103 @brief ベースカメラのビュー行列を設定します。 104 105 @param[in] view ベースとなるビュー行列 106 107 @return なし。 108 */ 109 void SetBaseCamera(const nn::math::Matrix34 *view); 110 /*! 111 :overload parameters 112 113 @brief ベースカメラのビュー行列を設定します。 114 115 @param[in] position カメラの位置座標 116 @param[in] rightDir カメラの右手方向を示す単位ベクトル 117 @param[in] upDir カメラの上方向を示す単位ベクトル 118 @param[in] targetDir カメラの撮影方向を示す単位ベクトル 119 120 @return なし。 121 */ 122 void SetBaseCamera(const nn::math::Vector3 *position, const nn::math::Vector3 *rightDir, 123 const nn::math::Vector3 *upDir, const nn::math::Vector3 *targetDir); 124 /*! 125 @brief 奥行き方向の限界視差を設定します。 126 127 @param[in] limit 設定する限界視差(mm) 128 129 @return なし。 130 */ 131 void SetLimitParallax(const f32 limit); 132 /*! 133 :overload newapi 134 135 @brief アプリケーション優先の方法で、左右カメラそれぞれのビュー行列とプロジェクション行列を計算します。 136 137 @param[out] projL 左のプロジェクション行列計算結果格納場所 138 @param[out] viewL 左のビュー行列計算結果格納場所 139 @param[out] projR 右のプロジェクション行列計算結果格納場所 140 @param[out] viewR 右のビュー行列計算結果格納場所 141 @param[in] depthLevel LCD 上に配置したい場所(基準面)までのカメラからの距離 142 @param[in] factor 立体具合の調整係数(0で視差が無くなり、1で標準となります。) 143 @param[in] pivot 上画面におけるカメラの上方向(回転処理に利用) 144 145 @return なし 146 */ 147 void CalculateMatrices(nn::math::Matrix44* projL, nn::math::Matrix34* viewL, 148 nn::math::Matrix44* projR, nn::math::Matrix34* viewR, 149 const f32 depthLevel, const f32 factor, 150 const nn::math::PivotDirection pivot = nn::math::PIVOT_UPSIDE_TO_TOP); 151 152 /*! 153 @brief 現実感を優先した方法で、左右カメラそれぞれのビュー行列とプロジェクション行列を計算します。 154 155 @param[out] projL 左のプロジェクション行列計算結果格納場所 156 @param[out] viewL 左のビュー行列計算結果格納場所 157 @param[out] projR 右のプロジェクション行列計算結果格納場所 158 @param[out] viewR 右のビュー行列計算結果格納場所 159 @param[in] depthLevel 液晶面に配置したい場所までのカメラからの仮想空間距離 160 @param[in] factor 立体具合の調整係数(0で視差が無くなり、1で標準となります。) 161 @param[in] pivot 上画面におけるカメラの上方向(回転処理に利用) 162 163 @return なし 164 */ 165 void CalculateMatricesReal(nn::math::Matrix44* projL, nn::math::Matrix34* viewL, 166 nn::math::Matrix44* projR, nn::math::Matrix34* viewR, 167 const f32 depthLevel, const f32 factor, 168 const nn::math::PivotDirection pivot = nn::math::PIVOT_UPSIDE_TO_TOP); 169 /*! 170 :overload oldapi 171 172 @brief 通常描画用のプロジェクション行列とビュー行列から、立体視用の左右それぞれの行列を計算します。 173 174 @param[out] projL 左のプロジェクション行列計算結果格納場所 175 @param[out] viewL 左のビュー行列計算結果格納場所 176 @param[out] projR 右のプロジェクション行列計算結果格納場所 177 @param[out] viewR 右のビュー行列計算結果格納場所 178 @param[in] projOriginal 元のプロジェクション行列 179 @param[in] viewOriginal 元のビュー行列 180 @param[in] depthLevel 液晶面に配置したい場所までのカメラからの仮想空間距離 181 @param[in] factor 立体具合の調整係数(0で視差が無くなり、1で標準となります。) 182 @param[in] realSwitch 現実感を出すために視野角の変更を許すか 183 184 @return 185 */ 186 f32 CalculateMatrices( nn::math::Matrix44* projL, nn::math::Matrix34* viewL, 187 nn::math::Matrix44* projR, nn::math::Matrix34* viewR, 188 const nn::math::Matrix44* projOriginal, const nn::math::Matrix34* viewOriginal, 189 const f32 depthLevel, const f32 factor, const bool realSwitch); 190 /*! 191 @brief カメラから指定した距離離れた地点における視差を画面幅に対する割合で求めます。 192 193 @param[in] distance カメラからの距離 194 195 @return 指定した地点における、左右方向それぞれに対するオブジェクトのずれ量(割合 1.0f = 100%) 196 */ 197 f32 GetParallax(const f32 distance) const; 198 199 f32 GetCoefficientForParallax(void) const; 200 /*! 201 @brief 最も遠い位置における視差を画面幅に対する割合で求めます。 202 203 @return 最も遠い位置に表示を行うためのオブジェクトのずれ量 204 */ 205 f32 GetMaxParallax(void) const; 206 /*! 207 @brief 設定されている奥行き方向の限界視差を取得します。 208 209 @return 設定中の限界視差(mm) 210 */ GetLimitParallax(void)211 f32 GetLimitParallax(void) const { return m_LimitParallax; } 212 /*! 213 @brief カメラから基準面までの距離を取得します。 214 215 @return カメラから基準面までの距離 216 */ GetDistanceToLevel(void)217 f32 GetDistanceToLevel(void) const { return m_DepthLevel; } 218 /*! 219 @brief カメラからニアクリップ面までの距離を取得します。 220 221 @return カメラからニアクリップ面までの距離 222 */ GetDistanceToNearClip(void)223 f32 GetDistanceToNearClip(void) const { return m_DistanceToNearClip; } 224 /*! 225 @brief カメラからファークリップ面までの距離を取得します。 226 227 @return カメラからファークリップ面までの距離 228 */ GetDistanceToFarClip(void)229 f32 GetDistanceToFarClip(void) const { return m_DistanceToFarClip; } 230 231 private: 232 233 struct CameraInfo 234 { 235 f32 left; //!< ビューボリュームの left 値 236 f32 right; //!< ビューボリュームの right 値 237 f32 bottom; //!< ビューボリュームの bottom 値 238 f32 top; //!< ビューボリュームの top 値 239 f32 near; //!< ビューボリュームの near 値 240 f32 far; //!< ビューボリュームの far 値 241 242 nn::math::Vector3 position; //!< カメラの位置 243 nn::math::Vector3 rightDir; //!< カメラの右方向の単位ベクトル 244 nn::math::Vector3 upDir; //!< カメラの上方向の単位ベクトル 245 nn::math::Vector3 targetDir; //!< カメラの注視点方向の単位ベクトル 246 }; 247 248 CameraInfo m_BaseCamera; 249 250 f32 m_LimitParallax; 251 252 f32 m_LevelWidth; 253 f32 m_DepthLevel; 254 f32 m_DistanceToNearClip; 255 f32 m_DistanceToFarClip; 256 f32 m_CameraInterval; 257 258 // bool m_IsInitialized; 259 // u8 rsv[3]; 260 }; 261 262 } // namespace CTR { 263 } // namespace ulcd { 264 } // namespace nn { 265 266 267 #endif // #ifndef NN_ULCD_CTR_STEREO_CAMERA_H_ 268 269