2倍近いオブジェクトは2倍大きく見えますか?


16

だから、私はあなたがZ軸に沿って動くことができる2Dゲームを作成することを考えていました、あなたがいる層を変えることによって。深度に応じて、2Dスプライトをスケーリングします。

かつて、誰かが私に多くの2Dスプライトを持つデモを見せてくれ、スクロールすることでカメラの深さを変えることができました。そのため、ズームインすると、オブジェクトはプレーヤーに近づき、大きく表示されます。それから、オブジェクトが1ユニット近くになったとき、オブジェクトはどのくらい大きくなるのかと思いました。どのように計算しますか?だから男は私に言った:私が使用している1つの基本的なルールがあります:「オブジェクトは2倍近く、2倍大きく表示されます。」

今、私はそれを自分でテストすることで、ルールが現実の世界に適用されないことを知っています;)しかし、遠近法などのために現実の世界の計算で使用される定数はありますか?または式?

これはそのような質問をするのに最適な場所ではないかもしれませんが、これはゲーム関連の質問に使用する唯一のサイトであり、私のコンテキストはゲームなので、試してみると思いました。また、3Dゲームに関連している可能性があるため、3Dの視点とマトリックスなどについてすべてを知っている人がここにいることを期待しています。

tl; dr:

「オブジェクトは2倍近く、2倍大きく表示されます」これは現実の世界では正しくありません。しかし、どの定数または式が正しいですか?


3
答えがわからないが、どうやって見つけることができるか知っている。何かの写真を撮ってください。たぶん一枚の紙。さまざまな既知の距離からそれらを取得し、いくつかの数学を実行して、画像によって紙片が占める量を計算し、それによって比率を決定します。楽しい実験になるかも!
スパルタンドーナツ

自然対数について誰も何も言及していないのはなぜだろう…
チャドハリソン

4
なぜそうではないのですか?本当だと思う。
イヴァンクキル

@hydroparadise自然対数はこの質問と何の関係がありますか?
ネイサンリード

ここで私はただつまらないだけですが、「Twice as close」は奇妙なフレーズです。それは「遠くまで」ではないでしょうか?「2回」は大きくなりますが、何かが近づくと距離は小さくなります。
MrVimes

回答:


19

一般に、ビューポイントとビューの移動方向、および表示角度によって異なります。

オブジェクトのパースペクティブの例

最初のカメラビューでは、赤のブロックがカメラビューに垂直であるため、オブジェクトは完全な1:2の比率で2倍の大きさに見えることに注意してください(移動後にビューの端に当たることを指す矢印に注意してください) 2倍近い)

2番目は、45度回転した同じサイズのブロックです。回転すると、下端はカメラから上端と同じ距離にないため、SEEMは1:2の比率に正しくスケーリングされませんが、実際には2倍の大きさです(遠い青いブロックの角度は、近くの青いブロックの角度と同じです。)

結論として、これは実際にはあなたの友人が正しかったことを意味し、オブジェクトの 1:1の比率(「オブジェクトは2倍近い、2倍大きい」)が適切な選択です。



素晴らしい答えです!写真は間違いなくそれをより明確にします。質問を投稿する前に、顔の前に手をかざして近寄ってみたので、今は本当にばかげていると感じています。そして、私は思った:いいえ、それは2倍の大きさのように感じない....私はより正確に測定する必要がありました;)視点は面白いものです!また、Ifeelのように、自分で写真を思いつくことができたはずです;)しかし、素晴らしい答えです!ありがとう!
ベリー

@メイソンウィーラー-並べ替え:P
トム 'ブルー'ピドック

8

2倍近いオブジェクトは2倍大きく表示されます。これはタレスの定理の結果であり、現実の世界では真実です。

Thalesの定理は、透視投影の背後にあるコア数学ツールであり、グラフィックパイプライン(OpenGLまたはDirectX)で透視分割として知られているものであると主張できます。それは、あなたが確実に知っておくべき定理であり、いつ使用できるかを認識することを学ぶべきです。


素晴らしい参考文献!私は間違いなくThales Theoremをチェックアウトし、グラフィックスパイプラインをよりよく理解しようとします。
ベリー

7

実際、これはほとんど真実です(オブジェクトを2倍遠くに動かすと半分に見えます)が、視聴者の動きに応じてオブジェクトの視覚的なサイズがどのように変化するかわかりにくくなります。具体的には、オブジェクトは近いほど大きくなるように見えます。これは、オブジェクトが遠くにある場合と比較して、オブジェクトが近い場合に、視聴者が半分の距離をはるかに高速にカバーするためです。別の言い方をすれば、視聴者の速度は一定ですが、オブジェクトまでの距離が変化すると、「距離の半分」の値が変化します。


2

実際に3D空間で作業しているわけではないので、スプライトは決して回転しないと想定できます(回転はスキューなどでシミュレートできます)。カメラから。

まず、3Dオブジェクトのレンダリング方法を理解する必要があります。カメラは単一の点に収束しますが、オブジェクトを描画する画面として機能する不可視の平面があります。画面について知っておく必要があるのは、カメラからどれだけ離れているかだけです。

これは、オブジェクトが2つの異なる距離でカメラにレンダリングされる様子を示す図です。

ご想像のとおり、オブジェクトの高さはカメラからの距離に依存します。しかし、レンディングはニアカリングプレーンで発生するため、そのポイントでスプライトの高さを計算する必要があります。

いくつかの基本的なトリガー計算により、次の式が得られます。

f(d, v) = v/(v+d)
* Where f is the size ratio to the original sprite aka size factor
    and v is the distance to the near clipping plane (trial and error value)
    and d is the distance from the near clipping plane to the object

例:

Assuming you have a sprite that is 2.5x1.8 units in size and 10 units away 
   from the camera, and that the near clipping plane is 5 units from the camera.

sizeFactor = 5/(5+10) = 0.3

renderHeight = actualHeight * sizeFactor = 1.8 * 0.3 = 0.54
renderWidth  = actualWidth * sizeFactor = 2.5 * 0.3 = 0.75

最初にv=5、それから外見に基づいて調整することをお勧めします。リアルタイムで変更を確認できるフィドルを一緒に投げることができます。

TL; DR

The change in height or width should be multiplied by the following factor:

sizeFactor = v/(v+d)

Where v = Some number greater than 0 that never changes (try 1 thru 5)
  and d = the distance from the camera

So an object that is 2.5 units tall would be rendered at 2.5*sizeFactor units tall.

編集: z軸に沿って移動すると言うと、(ほとんどの3Dゲーム、シューティングゲームなどのように)パースビューが必要になると仮定しています周辺視野に似ています。代わりに、正射投影ビューである数学で試してみます(マリオ、アングリーバード、スーパースマッシュブラザーズなど)。あなたが達成しようとしている見た目と感触はわかりませんが、それが現実的である限り、プレイヤーは決して知りません!

デモ!


はい、実際には正投影ビューを目指しています。私の現在のインスピレーションから「借りている」ゲームは、Rayman Originsです。ゲームの一部のセクションでは、花に飛びついてから、深さの異なる別のレイヤーで跳ねることができます。次に、カメラはその深度に対応してズームインまたはズームアウトします。このビデオでは、4:50および5:00にアクサンプルを見ることができます。
ベリー

さらに、素晴らしい答えです!しかし、「2倍近く、2倍」というルールが適用されるという確認だけで十分だったので、Blueの答えを最良のものとして選択しました。
ベリー

ありがとう、そしてあなたのゲームで最高の幸運を!しかし、すべてがカメラに非常に近い場合、「2倍近く、2倍」がうまく機能することを他の人に明確にしたいのです。物事が遠ざかるにつれて、知覚されるサイズの変化は小さくなります。たとえば、親指を近くで見てから、腕を伸ばして見てください。親指のサイズが大幅に小さくなります。その後、遠くのものを見てください。後方に1歩進みます(腕の長さとほぼ同じ)。サイズがほとんど変わっていないことに注意してください。ゲームに長い視野がある場合、少しの数学を使用することは大いに役立ちます。
ジムバック

編集:以前のコメントで間違いを犯しました。「2倍近く、2倍」は、アイテムがカメラからの距離に関して互いにかなり近いままである場合に正しいです。
ジムバック

これは、マウスを使用して移動し、スクロールホイールを使用して深さを変更する簡単なデモです。
ジムバック

0

これはカバーされていませんでしたが、これは有益だと思いました:距離を半分にすると、X次元とY次元の両方でサイズを2倍にすると、スプライトの合計面積が4倍になります。それの訳は:

Area = X * Y

ズームイン後:

NewArea = (x*2) * (y*2)

これにより、ズーム効果が急速に発生している、または強すぎるという印象を与えます。代わりに、上記の式の2を1.5または1.33などの浮動小数点値に変更することにより、係数を調整できます。

あるいは、私がやったことは、カメラの深さ(距離)をタイルにカメラ値(XおよびY)とともにバイト値で保存し、投影タイルサイズを計算することです:

XTileSize = (255 / CameraZ) * DefaultTileWidth
YTileSize = (255 / CameraZ) * DefaultTileHeight

CameraZ厳密には1〜255の範囲内である必要があり、その制限が将来的には利益になるか、または悩みの種になる可能性があることに注意してください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.