カメラの代わりに世界を動かすのはなぜですか?


87

OpenGLゲームでは、プレーヤーを動かすために私たちがやることは、カメラを動かすのではなく、全世界を動かすことだと聞きました。

たとえば、このチュートリアルの抜粋は次のとおりです。OpenGLビューマトリックス

実生活では、特定のシーンのビューを変更するためにカメラを移動することに慣れていますが、OpenGLでは逆です。OpenGLのカメラは移動できず、負のZ方向に面する(0,0,0)に位置するように定義されています。つまり、カメラを移動および回転させる代わりに、カメラの周りで世界を移動および回転させて、適切なビューを構築します。

なぜそうするのですか?


1
カメラは、投影ビューに他なりません。だから、あなたはあなたが望む投影を得るために世界を変えます。コンセプトは奇妙であるが、それは実際に理にかなって...のように...私は思う
Sidar

@sharethis、私はより良い説明で私の答えを改善しました。数学と3Dカメラ(仮想カメラ)オプションを使用した投影パースペクティブを追加しました。あなたや他の人に役立つかもしれません。
メリーランドマババー・ラーマン

4
これは実際には正しくありません。両方の操作(カメラまたは世界のオブジェクトの移動)が対称的であるため、どちらの操作が行われたかを知る方法がありません。あなたはカメラの周りを動く世界について考えていますが、他の誰かが同じようにカメラが世界を逆に移動するのを視覚化することができます...人が「間違っている」場合、状況を視覚化する両方の方法が異なる状況で良いです。多くの場合、両方について考えると役立ちます。
user3728501

回答:


72

どうして ?

なぜなら、カメラは投影ビューを表しているからです。

しかし、3Dカメラ(仮想カメラ)の場合、世界ではなくカメラが動きます。この回答については後で詳しく説明しました。

数学的に理解する

投影ビューは空間内を移動し、向きを変更します。最初に気づくのは、画面上の希望する投影が視線方向によって変化しないことです。

このため、他のものを変換して目的の投影を取得します。

http://opengl.orgからの理解

カメラを移動するように見せるために、OpenGLアプリケーションはカメラ変換の逆でシーンを移動する必要があります。OpenGLに関しては、カメラはありません。より具体的には、カメラは常に目の空間座標(0、0、0)に配置されます

http://open.glからの理解

また、http://open.gl/transformationsのビューマトリックス部分から次の行を共有したい

カメラの変換をシミュレートするには、実際にその変換の逆で世界を変換する必要があります。例:カメラを上に移動する場合は、代わりにワールドを下に移動する必要があります。

視点で理解する

現実の世界では、「視点」と呼ばれる方法で物事を見ています。

遠近法とは、遠くにあるオブジェクトは、近くにあるオブジェクトよりも小さく見えるという概念です。遠近法はまた、まっすぐな道路の真ん中に座っている場合、実際には道路の境界が2本の収束線として見えることを意味します。

それが展望です。3Dプロジェクトでは視点が重要です。視点がなければ、3Dの世界は現実に見えません。

これは自然で明白に思えるかもしれませんが、コンピューターで3Dレンダリングを作成するとき、コンピューター画面(2Dサーフェス)で3Dワールドをシミュレートしようとしていることを考慮することが重要です。

コンピューター画面の後ろに実際の3Dシーンがあり、コンピューター画面の「ガラス」を通して見ていると想像してください。パースペクティブを使用して、あなたの目標は、画面のこの「ガラス」に「投影される」ものをレンダリングするコードを作成することです。唯一の注意点は、この3Dワールドは現実的ではないということです。これは、3Dワールドの数学的シミュレーションにすぎません。

そのため、3Dレンダリングを使用してシーンを3Dでシミュレートし、3Dシーンを画面の2Dサーフェスに投影する場合、このプロセスは透視投影と呼ばれます。

達成したいことを直感的に想像することから始めます。オブジェクトがビューアに近い場合、オブジェクトは大きく見える必要があります。オブジェクトがより遠くにある場合、より小さく見える必要があります。また、オブジェクトが視聴者から離れて直線で移動している場合は、遠くに移動するにつれて、オブジェクトを画面の中心に向かって収束させます。

視点を数学に変換する

次の図の図を見ながら、オブジェクトが3Dシーンに配置されていることを想像してください。3Dの世界では、オブジェクトの位置は、視点を原点とする3D座標系を指すxW、yW、zWとして記述できます。それは、画面の向こうの3Dシーンで、オブジェクトが実際に配置される場所です。

ここに画像の説明を入力してください

視聴者がスクリーン上でこのオブジェクトを見ると、3Dオブジェクトは、スクリーンの2D座標系(投影面)を参照するxPおよびyPとして記述される2D位置に「投影」されます。

これらの値を数式に入れるには、世界座標に3D座標系を使用します。x軸は右を指し、yは上を向き、画面内では正のz点を指します。3D原点は、視聴者の目の位置を指します。そのため、画面のガラスは、z軸に直交する(直角で)平面上にあります。z軸はzProjと呼びます。

次のように、ワールド位置xWとyWをzWで除算することにより、投影位置xPとyPを計算できます。

xP = K1 * xW / zW
yP = K2 * yW / zW

K1とK2は、投影面(​​ビューポート)のアスペクト比や広角視力の程度を考慮した目の「視野」などの幾何学的要因から得られる定数です。

この変換がどのように遠近感をシミュレートするかを見ることができます。目からの距離(zW)が増加すると、画面の側面に近いポイントが中心に向かって押し出されます。同時に、中心(0,0)に近いポイントは、目からの距離による影響がはるかに少なく、中心に近いままです。

このzによる除算は、有名な「遠近法の除算」です。

ここで、3Dシーン内のオブジェクトが一連の頂点として定義されていると考えてください。そのため、この種の変換をジオメトリのすべての頂点に適用することにより、オブジェクトが視点から離れると縮小することを効果的に保証します。

その他の重要なケース

  • 3Dカメラ(仮想カメラ)の場合、世界の代わりにカメラが動きます。

3Dカメラの理解を深めるために、映画を撮影していると想像してください。撮影したいシーンを設定する必要があり、カメラが必要です。映像を取得するには、カメラを使用してシーンをローミングし、シーン内のオブジェクトをさまざまな角度と視点から撮影します。

3Dカメラでも同じ撮影プロセスが発生します。作成した「仮想」シーンを動き回れる「仮想」カメラが必要です。

2つの人気のある撮影スタイルには、キャラクターの目を通して世界を見る(1人称カメラとも呼ばれます)か、カメラをキャラクターに向けて視界を維持する(3人称カメラ)ことが含まれます。

これは、3Dカメラの基本的な前提です。3Dシーンを動き回って、特定の視点から映像をレンダリングするために使用できる仮想カメラです。

ワールド空間とビュー空間を理解する

このような動作をコーディングするには、3Dワールドのコンテンツを、ワールド座標系の視点だけでなく、他の固定視点からでも、カメラの視点からレンダリングします。

一般的に、3Dシーンには3Dモデルのセットが含まれます。モデルは一連の頂点と三角形として定義され、独自の座標系を参照します。モデルが定義されている空間は、モデル(またはローカル)空間と呼ばれます。

モデルオブジェクトを3Dシーンに配置した後、「ワールド変換」マトリックスを使用してこれらのモデルの頂点を変換します。各オブジェクトには、ワールド内のオブジェクトの位置と向きを定義する独自のワールドマトリックスがあります。

この新しい参照システムは「ワールド空間」(またはグローバル空間)と呼ばれ、それを管理する簡単な方法は、ワールド変換マトリックスを各オブジェクトに関連付けることです。

3Dカメラの動作を実装するには、追加の手順を実行する必要があります。ワールドの原点ではなく、ワールドを参照しますが、3Dカメラ自体のリファレンスシステムを参照します。

適切な戦略には、カメラを3Dの世界の実際の3Dオブジェクトとして扱うことが含まれます。他の3Dオブジェクトと同様に、「ワールド変換」マトリックスを使用して、カメラを3Dワールドの目的の位置と方向に配置します。このカメラワールド変換行列は、カメラオブジェクトを元の(z軸に沿った)前方から実際の世界(xc、yc、zc)位置、および世界の回転に変換します。

次の図は、ワールド(x、y、z)座標系とビュー(カメラ)(x '、y'、z ')座標系との関係を示しています。

ここに画像の説明を入力してください


5
他の答えはそこにあります。それらを自分用に編集する必要はありません。
ジェシードーシー

1
@Noctrine、ありがとう。ページ間リンクを作成する方法は私には不明でした。
メリーランドマババー・ラーマン

「次のセクションでは、この透視投影式をActionScriptに使用して、Flash 3Dプロジェクトで使用できるようにします。」元の質問にはFlash 3Dプロジェクトについて言及していないため、ソースを引用すると、これを他のどこかからコピーアンドペーストしたと思うようになります。
ジル

@Gilles、私のミスでごめんなさい。回答を編集しました。私はいくつかの情報源を研究して答えを準備しました。そして、あなたが指摘したようにあなたに感謝します。:)
Mdマブブールラーマン

eng.utah.edu/~cs6360/Lectures/frustum.pdfおよびopengl.org/archives/resources/faq/technical/viewing.htmでglMatrixMode()参照されているその他の関数は廃止されていることに注意してください。ただし、数学的な記述は正しいままで役に立ちます。
patryk.beza

28

Mahbubar R Aamanの答えは非常に正確であり、彼が提供するリンクは数学を正確に説明していますが、技術的ではない/数学的な答えが必要な場合は、別のアプローチを試してみます。

現実世界とゲーム世界のオブジェクトの位置は、何らかの座標系で定義されます。座標系は、位置の値に意味を与えます。私が「100,50」にいると言ったら、それらの数字が何を意味するのか(マイル、キロメートル、緯度、経度など)を知らない限り役に立ちません。それらがデカルト座標(「通常の」種類の座標)である場合は、それらがどの原点に関連しているかを知る必要もあります。「私は東へ100フィートです」とだけ言うと、座標の原点と呼ばれる「East of what」を知る必要があります。

これを考える簡単な方法があります。「電車の駅は、街の南西の角から北に3キロメートル、東に1.5キロメートルです。」また、誰かに「駅は私が今いる場所のすぐ北に1マイルです」と伝えることもできます。どちらの座標も正しいものであり、同じランドマークの場所を特定しますが、異なる原点から測定されるため、異なる数値を持ちます。

3Dアプリケーションには、一般的に「ワールド」座標系があります。これは、カメラとゲーム内のオブジェクトの位置を表すために使用され、デザイナーが指定した任意の原点(通常はあらゆるレベルの中心)のデカルト座標で測定されますまたはあなたがプレイしているマップ)。原点にカメラがあるデカルト座標系など、ゲームには他の座標系が存在します。いつでも好きな方法で新しい座標系を定義できます。これは、3Dシミュレーションで非常に頻繁に行われ、計算が簡単になります。

個々の三角形を実際に画面にレンダリングするアルゴリズムは特定の方法で機能するため、レンダリング時にワールド座標を直接操作するのは便利ではありません。「オブジェクトは世界の中心から右に100単位です」などの情報を処理するように数学が設定されていません。代わりに、数学は「オブジェクトがカメラの正面にあり、20ユニット離れている」で動作することを望んでいます。したがって、オブジェクトワールドの位置を取得し、それらをカメラ座標系に変換するために、レンダリングの数学に追加のステップが追加されます。

もちろん、カメラには位置と向きもあります。そのため、オブジェクトが位置20,100,50にあり、カメラが位置10,200、-30にある場合、カメラに対するオブジェクトの位置は10,100,80(オブジェクトの位置からカメラの位置を引いた位置)です。ゲーム内でカメラが移動すると、ワールド座標でのそのカメラ位置は予想どおりに移動します。

オブジェクトは移動されないことに注意してください。彼らは以前の場所にとどまっています。ただし、それらの位置は現在、異なる座標原点を基準にして表されています。オブジェクトのワールド座標は、オブジェクト自体が移動する場合にのみ移動しますが、カメラの位置に相対的であるため、カメラが移動するたびにカメラ座標も変化します。

また、引用しているチュートリアルの説明は簡略化された説明であり、OpenGLの機能の正確な説明とは限りません。記事の著者がそれを理解できなかったとは思わない。著者は、この場合、混乱を解消するのではなく、単純化した類似性を使用しようとしました。

数学がカメラ座標を気にする理由をさらに理解するのに役立つ場合は、この演習を試してください:親指と人差し指で手を触れて長方形を作り(「ビューポート」と呼びましょう)、あなたがいる部屋を見渡しますin。オブジェクトを見つけて、それを見てから、それを見回すが、直接見ない。その場合、「自分のビューポートのオブジェクトはどこですか?」と自問してください。そのオブジェクトには、地球上の位置を正確に特定するために使用できる特定の現実世界の経度と緯度がありますが、それはあなたが見ているものについて何も伝えません。「オブジェクトはビューポートの左上隅にあり、約2メートル離れているように見える」と言うと、かなりわかります。頭と方向に関連した座標系を作成しました あなたのビジョンに応じてオブジェクトの場所を定義する再検討。これは基本的にOpenGL / Direct3Dの三角形ラスタライザー部分に必要なものであり、数学ではオブジェクトの位置と方向を便利な世界座標からカメラ座標に変換する必要があります。


私にとって数学的な説明は明確で理解しやすいものですが、これも素晴らしい説明です!同じ質問で他の多くの人を助けたと思います。
ダニジャー

+1は、カメラが動くか、世界が単にあなたが話している座標系の関数であるかどうかを明確にするためです。
デビッドモールズ

11

他の2つ(優れた)に追加するだけで、Mahbubur R Aamanが触れた「カメラがありません」という点についてさらに詳しく説明します。

これは非常に真実であり、「カメラ」は実際には存在しないため、一般的な「カメラ」の類推の失敗を表します。カメラのアナロジーがまさにそれであるということを理解することが重要です-アナロジー。それは、物事が舞台裏で実際に機能する方法を説明しません(または説明するふりをしません)。

だから、それがあなたにとって新しいものである場合、あなたがあなたの頭を動かすのを助ける手段としてそれを見る(しゃれを意図した)が、それは単なるヘルパーであり、物事が実際にある方法のいかなる種類の説明でもないことを常に覚えておいてください。

これで、ここに関連するオブジェクトの2つのクラスがあります。それは、視点と世界のすべてです。ビューポイントをいくつかのオブジェクトの近くに移動したいが、この移動では、ビューがオブジェクトの近くに移動しても、オブジェクトがビューの近くに移動しても、最終結果はまったく同じです。あなたがしているのは、それらの間の距離を変更することです。現在の距離はXであり、新しい距離をYにしたいので、移動後に新しい距離がYである限り、どちらを移動してもかまいません。したがって、実際にはまったく移動していません。 '距離を変えているだけです。(これですべてのアインシュタインを訪ねるつもりはなかった...正直!)

ただし、カメラは存在しないため、距離を変更できるのはオブジェクトのみです。したがって、オブジェクトの距離を変更すると、まったく同じ結果が得られます。とにかくすべてのオブジェクトが変換通過するため、これは多かれ少なかれ高価ではありません。

より簡単な数学的説明が役立つかもしれません。すべての座標が1D-視点が0、オブジェクトが4、視点を3にしたいものとします。つまり、それらの間の距離は4(4-0)から1(4- 3)。しかし、カメラが存在しないため、その0を変更することはできません。常に0になります。したがって、3を0に追加する(実行することはできません)代わりに4から3を減算する(実行することができます)-オブジェクトは1になり、最終結果は非常に同じです-間の距離視点とオブジェクトは1です。


カメラはそのようには存在しませんが、変換前にその位置を計算できます。ただし、場合によっては(軸に沿っていない平行投影)、通常の座標が「無限大」(正または負)になり、変換マトリックスよりも有用性が低くなります。
マーティンソイカ

7

カメラの移動または世界の移動は、同じ有効性を持つ2つの同等の有効な選択肢です。一日の終わりに、ある座標系から別の座標系に変更しています。上記の答えは正しいですが、それを視覚化する方法は同じコインの両面です。変換はどちらの方向にも進むことができます-それらはお互いのちょうど逆です。

レンダリングプロセスの一部は、ワールド座標から目の座標に変換します。ただし、これをモデル化する簡単な方法は、アプリケーションの仮想カメラオブジェクトを使用することです。カメラは、投影マトリックス(遠近効果に関与する)と、ワールド空間から目の空間への変換に使用されるビューマトリックスの両方を表すことができます。

したがって、頂点シェーダーはビューマトリックスを使用してジオメトリの座標を目の空間に変更しますが、移動するとビューマトリックスを再計算する仮想世界を移動するカメラオブジェクトについて考える方が簡単です。

したがって、アプリケーションでは、カメラをワールド座標で移動し、camer'asビューマトリックスを更新し、新しいビューマトリックスをユニフォームまたはブロックの一部として頂点シェーダーに渡し、シーンをレンダリングします。


5

代わりに、それは欠陥のある類推だと仮定します。最も基本的な「カメラの移動」と「世界の移動」はまったく同じ数学的構造です。世界を移動することは、特に階層変換に関しては概念的に考えるのがやや簡単なだけです。基本的に、世界の頂点をカメラの座標空間に変換するという点でのみ、カメラの周りで世界を動かしていますが、これは可逆的なアフィン変換です。

ただし、視界の決定をミックスに取り入れ始めるとき、最後にやりたいことは、カメラの周りの世界全体を翻訳することです。代わりに、ほとんどの場合(特に固定BSPなどの古典的な場合)、世界内のカメラの位置を使用して、可視性構造を照会し、どの物が見える可能性があるかを判断し、それらを翻訳するだけですカメラの座標空間に物事。


4

ゲーム内で世界座標を「移動」することはめったになく、実際には仮想カメラの座標を変更するため、この主張は明確に真実だとは思わない。

カメラの概念が実際に行うことは、有限の視錐台を変換することです。つまり、8つのコーナーポイント(または6つの平面の交点によって定義される)を持つ角錐台を、openGLの最終段階のクリップスペースを表す単位立方体に変換しますレンダリングパイプライン。

その意味では、ワールドは移動しませんが、クリップ空間の座標系でワールド座標を計算するだけです。


2

カメラの移動または世界の移動は、等しく有効な2つの選択肢です(両方とも当てはまります)。一日の終わりに、ある座標系から別の座標系に変更しています。変換はどちらの方向にも進むことができます-それらはお互いのちょうど逆です。


2

ここにたくさんの良い答えがあります。それらのいずれも繰り返さないようにします。Direct3Dの機能のように、カメラの観点から考えるのが簡単な場合があります(注:多くの9.0cポストでプレイしていない)

「世界を動かす」というのは、フューチュラマのように引用された誰かがそれを見るのに非常に良い方法だということです(「エンジンは船をまったく動かしません。船はその場所にとどまり、エンジンは宇宙を動き回りますそれ!")。これは、実際には2Dゲームではかなり一般的でした。文字通り、調整に苦労するビューポートがあり、それがビデオRAMまたはUIウィンドウである場合がありました。OpenGLがそのような理由でそれを行う場合、わかりにくいです。

確かにカメラの観点からも2Dモーションを考えることができます。そのような思考プロセスだけで、効果を把握しやすくなります。


1
遅いですが、いい答えも!
ダニジャー

ありがとう!私はいつも、検索エンジン経由で発見されたページ上の議論に追加すると、多くの情報が便利か面白い場合は特に、理解されるが判明することがわかった
ジョーPlante

2

ここには、OpenGL docsのライターから始まって、多くの誤解があるようです...

すぐにあなたの正気を回復させてください。世界は動かず、そのままです。プレイヤーの周りを動き回って世界を実装しようとする人は誰でも、マルチプレイヤーモードですぐにトラブルに直面します。言うまでもなく、各プレイヤーの動きで世界の数百万(または数十億)のオブジェクトの位置を更新すると、ゲームプレイがかなり遅くなります...

それで、そこで実際に何が起こり、見積もりはどうなりますか?

さて、まず第一に、座標系の概念を理解する必要があります。通常、世界の1つのポイントを選択し、それを「原点」、つまり座標(0,0,0)を持つポイントとして宣言します。また、X、Y、Zと呼ばれる3つの「主な」方向を選択します。明らかに、座標系を割り当てる方法はたくさんあります。通常、1つの「世界座標系」があり、このシステムでは世界は静止しています(多かれ少なかれ)。ゲームでは、このシステムはレベル設計者によって選択されます。

現在、プレイヤーの目と結びついた別の座標系を考慮することも便利です。この座標系では、プレーヤーは常に座標(0,0,0)にあり、世界は彼を中心に移動および回転します。したがって、プレイヤーの座標系で作成れていると理解している場合、見積もりは正しいです。

しかし、世界はプレイヤーの座標で動作するのではなく、世界の座標で動作します。また、2つの座標系が関係する場合、常に1種類の座標を他の座標に変換する方法があります。OpenGLでは、これは4x4ビューマトリックスを使用して行われます。

最終的に、プレイヤーが移動すると、プレイヤーが移動している間、世界は静止したままになります。これは、ワールド座標、つまりオブジェクトがゲームに保存される方法です。プレーヤーには、彼に関連付けられたビューカメラもあり、このカメラは同様に世界中を動きます(OpenGLのドキュメントが言っていることにもかかわらず)。ただし、ユーザーの画面に世界を表示するために、すべての可視オブジェクトの座標は、変換マトリックスを使用してプレーヤーの座標系に変換され、追加の投影が適用されて遠近効果が作成されます。このプレイヤーの座標系では、世界は実際にプレイヤーの周りを移動しているように見えます。しかし、それはそれについて非常に役に立たず、混乱する方法です。


OpenGL docsのライターから始めて」そうです。OpenGLのメーカーは明らかに愚かすぎて、世界の表現(これはすべてOpenGLが関心を持っている)とその世界の概念表現( OpenGLが扱うものではありません)。
ニコルボーラス

しかし、それは非常に役に立たず、混乱する考え方です。」それも真実です。そして、真実は嘘よりも常に助けになります。遅かれ早かれ、その嘘はあなたに追いつき、あなたは真実に直面しなければならないからです。
ニコルボーラス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.