3. グラフィックス

3.1. 1 フレームごとに輝度差が大きな変化を反復することへの制限

1 フレームごとに輝度差が大きな変化を反復させる表示(点滅など)を行うと、液晶モジュールの寿命に悪影響を及ぼします。そのため、1 分以上の間、同じピクセルがこのような表示になることはできる限り回避するようにしてください。なお、ここでいう「輝度差の大きな変化」とは RGB すべての要素で 128 以上の差がある変化のことを指します。

また、2 つの色の反復表示で半透明を表現するという、液晶モジュールの特性を利用した映像手法は推奨しません。そのような表示を行うと、製品仕様の変更や互換機の発売などで現行機よりも応答速度の速い液晶モジュールが採用された場合に点滅して見える可能性があります。

 

グラフィックス

液晶モジュール

反復表示

点滅

輝度差

3.2. 立体視表示を使用しないアプリケーション

立体視表示モード(NN_GX_DISPLAYMODE_STEREO)と通常モード(NN_GX_DISPLAYMODE_NORMAL)では消費電力に大きく差があります。

そのため、バッテリーのみでの稼働時間への影響を考慮して、立体視表示を一切行わないアプリケーションでは立体視表示モードにすることを禁止しています。また、同様の理由で、アプリケーションが立体視表示を行わない場面では通常モードにすることを推奨します。

 

立体視表示

NN_GX_DISPLAYMODE_STEREO

NN_GX_DISPLAYMODE_NORMAL

消費電力

 

3.3. 立体視表示に対応する場合

立体視表示に対応するアプリケーションは、ユーザーの 3D ボリューム操作による視差調節に nn::ulcd::CTR::StereoCamera クラスの API を使用してください。nn::ulcd::CTR::StereoCamera クラスを使用せずに独自の実装で視差調節を行うと、将来の互換機で視差調節が意図した通りに動作しない可能性があるためです。ただし、以下のような場合は nn::ulcd::CTR::StereoCamera クラスの API を使用しなかったり、視差を調節できなかったり、視差の追随ができなかったりしても構いません。

  • 以下のように、3D ボリュームに応じた視差変更ができないコンテンツを立体視表示する場合
    • 作成済みのコンテンツ(プリレンダムービーや写真)
    • アウトカメラで取得した画像
  • ゲームをポーズした瞬間など、3D ボリュームへの視差の追随が技術的に困難な場合(ただし、短時間でユーザーにとって不便とならない範囲であること)
  • アプリケーションの進行にともない、一時的に立体視表示しない場合
  • 3D ボリュームに応じた視差変更ができないコンテンツに、リアルタイムに描画するオブジェクトを重ねて表示する場合
    リアルタイム描画のオブジェクトだけに 3D ボリュームの操作を適用すると前後関係の矛盾が生じて不快な立体映像になる可能性があるため、この場合は 3D ボリュームに対応しないことを推奨します。

3D ボリュームは原則として、ユーザーが快適に立体視できる視差の個人差を吸収するためのものであり、アプリケーション開発者に自由度や新たな入力インターフェースを提供するためのものではありません。ただし、以下のように 3D ボリュームを立体視に関するなんらかの効果を調節する目的で使用するのであれば、nn::ulcd::CTR::StereoCamera クラスの API を用いた 3DS 標準の視差調整と完全に同一な効果でなくても、3D ボリュームの値をアプリケーションで利用することができます。

  • 2D のレイヤーに 3D ボリュームの値に比例する視差をつけて立体視を実現したい場合
  • 奥や手前にある物体に 3D ボリュームの値に応じたぼかし(ブラー)をかけて表示したい場合

3D ボリュームの値は nn::ulcd::CTR::Get3DVolume 関数で取得することができます。 なお、nn::ulcd::CTR::Get3DVolume 関数を使用せず、視差の量などから 3D ボリュームの値を逆算して求めることは禁止されています。これは、逆算によって得た 3D ボリュームの値を使用した実装が将来の互換機で意図しないものになってしまう可能性があるためです。

 

立体視表示

3D ボリューム

視差

プリレンダムービー

アウトカメラ

nn::ulcd::CTR::StereoCamera クラス

nn::ulcd::CTR::Get3DVolume 関数

 

3.4. 立体視表示が許可されているかどうかを利用する場合

nn::gx::CTR::IsStereoVisionAllowed 関数で立体視表示が許可されているかどうかを確認することができますが、許可状態にあわせてアプリケーションの動作を変更する場合は立体視表示に関連したものにしてください。ただし、nn::gx::CTR::IsStereoVisionAllowed 関数の結果によって、nngxSetDisplayMode 関数による上画面の表示モード切り替えを行うことは禁止です。これは nngxSetDisplayMode 関数が、ユーザーに立体視表示が可能であることを伝えるために設けられた 3D ランプの点灯と連動しているためです。

立体視表示の許可状態にあわせてアプリケーションの動作を変更する場合、以下のような処理であれば問題ありません。

  • 写真撮影のモード選択画面において、立体視表示が許可されていない場合はアウトカメラでの 3D 写真撮影モードを選択できないようにする
  • 立体視表示の許可状態が切り替わった際に効果音を鳴らす
  • アプリケーションの内容に影響を与えない、見た目のみの変化を付ける

一方、以下のような処理は禁止です。

  • 立体視表示の許可状態にあわせて nngxSetDisplayMode 関数による上画面の表示モード切り替えを行う
  • 立体視表示の許可状態の切り替わりを、キャラクターを操作するための入力として処理する
  • 立体視表示が許可されているかどうかで敵の強さが変わる

 

立体視表示

3D ランプ

表示モード

nn::gx::CTR::IsStereoVisionAllowed 関数

nngxSetDisplayMode 関数

 

3.5. 立体視表示が許可されていない状態では右目用バッファを更新しない場合

3D ボリュームの OFF やペアレンタルコントロールで立体視表示が禁止されているときに、処理負荷の軽減のために右目用バッファの更新を行わないような実装をする場合は、HOME メニューに遷移して立体視表示が許可されても不適切な立体視表示にならないようにしてください。ここでいう不適切な立体視表示とは左目用と右目用のバッファ間で内容の差異が大きい状態のことです。たとえば、片目側だけが黒画面であったり、左目用と右目用のバッファそれぞれが異なるシーンの映像であったりといった状態がこれに該当します。

具体的には、HOME メニューに遷移するまでに左目用バッファの内容を右目用バッファにコピーする方法や、どちらのバッファとも黒画面にする方法などで対処してください。

対処できているかどうかは、以下の手順で確認することができます。

  1. 右目用バッファの更新を行わない実装がなされているシーンまで進める。
  2. 3D ボリュームを OFF の状態(完全に下げた状態)にする。
  3. 上画面が変化するまでプレイする。
  4. HOME ボタンを押して HOME メニューに遷移する。
  5. 3D ボリュームを ON の状態(完全に上げた状態)にする。
  6. 本体内蔵の「ゲームメモ」アプレットを起動し、上画面のアプリケーション画像(スクリーンショット)を確認する。

 

立体視表示

3D ボリューム

HOME メニュー

HOME ボタン

3.6. ImageDb ライブラリを使用する場合

ImageDb ライブラリを使用する際は、以下の点に注意してください。これらの注意点は、ImageDb パッケージ同梱の「ImageDb プログラミングマニュアル」にも記載されています。

  • 立体のスクリーンショットを保存する場合は、立体視表示されないときに JPEG のみを保存するようにしてください。
  • ImageDb ライブラリでは 3DS カメラで撮影された写真以外の画像を読み込むことができます。そのため、以下のような対応を行い、サイズが 640x480 以外の画像を読み込んだ場合でもアプリケーションが正常に動作するようにしてください。
    • 拡大縮小やトリミングなどを行い正常に表示する。
    • アプリケーションが対応していないサイズの画像を読み込まない。
  • アプリケーション中のスクリーンショットを保存する場合は、imgdb::JpegMpBaseSaver::SetScreenshotFlag 関数でスクリーンショットフラグを true に設定し、ニンテンドー3DSカメラのスライドショーテーマ「ゲーム特集」で表示されるようにしてください。

 

補足:

imgdb::JpegMpBaseSaver::SetScreenshotFlag 関数でスクリーンショットフラグを false に設定するのは「アプリ独自のオブジェクトが写り得ないシーン」とし、単純なカメラ画像はそれにあたります。例えば AR 表示の切り替わりのように、カメラを使用するシーンにおいてタイミング次第でオブジェクトが見え隠れすることがある場合は「アプリ独自のオブジェクトが写るシーン」として解釈し、imgdb::JpegMpBaseSaver::SetScreenshotFlag 関数でスクリーンショットフラグを true に設定します。オブジェクトの見え隠れに応じてスクリーンショットフラグの設定を切り替える必要はありません。

また、表示用のバッファではない独自のバッファを JPEG として保存する場合のスクリーンショットフラグの設定に関しては任意としますが、「ユーザーがその画像をゲームのスクリーンショットと思えるかどうか」を判断基準としてください。たとえば、ゲーム画面の下辺に文字列を加えたものであればスクリーンショットと取られることが多く、画面に表示する訳ではない QR コードはそう取られることは少ないと考えられます。

 

 

ImageDb ライブラリ

3DS カメラ

写真

JPEG

スクリーンショット

スライドショー

imgdb::JpegMpBaseSaver::SetScreenshotFlag 関数