ピクセルアートモーションの「階段効果」をどのように回避できますか?


21

アンチエイリアシングによるぼかし効果を避けるために、正確なピクセル座標でスプライトをレンダリングしています(スプライトはピクセルアートであり、フィルター処理するとひどく見えます)。ただし、オブジェクトの移動には可変速度、重力、物理的相互作用が含まれるため、軌跡はサブピクセル精度で計算されます。

スクリーンスペースの速度が十分に大きい場合(vΔtが2または3ピクセルより大きい場合)、これは非常にうまく機能します。ただし、速度が小さい場合、特に対角線に沿って顕著な階段効果が現れることがあります。これは、非常に遅い画面空間速度(v << 1ピクセル/秒)ではもはや問題ではないため、中間速度値のソリューションを探しています。

左側には、オブジェクト座標を単純に丸めることで得られる、大きな速度のプロットされた軌跡があります。中央では、速度が小さくなると何が起こるか、そして私が話している階段効果を見ることができます。右側に、取得したい軌跡の軌跡を示します。

オブジェクトの軌跡のピクセル座標

大小の速度で元の動作を維持しながら、エイリアシングを最小限に抑えるために軌跡をフィルタリングするアルゴリズムのアイデアに興味があります。Δt、瞬時の位置と速度、および任意の数の以前の値にアクセスできますが、リアルタイムシミュレーションであるため、将来の値については知りません(必要な場合、特定の仮定の下で推定値を推定できます) 。物理シミュレーションのため、突然の方向変更も発生する可能性があることに注意してください。

回答:


18

これは、合理的にうまく機能するはずのアルゴリズムの簡単な概要です。

  1. まず、オブジェクトが移動する方向を計算し、水平または垂直に近いかどうかを確認します。
  2. 方向が垂直(水平)に近い場合、方向ベクトル沿ってオブジェクトの位置を最も近いピクセル行(列)の中心に調整します。
  3. 位置を最も近いピクセルの中心に丸めます。

擬似コードで:

if ( abs(velocity.x) > abs(velocity.y) ) {
    x = round(position.x);
    y = round(position.y + (x - position.x) * velocity.y / velocity.x);
} else {
    y = round(position.y);
    x = round(position.x + (y - position.y) * velocity.x / velocity.y);
}

編集:うん、テスト済み、非常にうまく動作します。


+1、これは驚くほどうまく機能します!速度ベクトルとは反対の方向に調整できるため(通常は問題ありませんが、小さな軌道曲率ではないため)、低速での円運動での奇妙な後方ジャンプに気付きます。これはvelocity.y / velocity.x、速度に比例する補正係数を掛けることで解決できます。
サムホセバル

@Sam:小さい回転半径(=高い曲率)を意味しますよね?それは確かに、低速度での線形外挿で問題を引き起こす可能性があります。(基本的に、加速度ごとの2乗の速度が1ピクセルよりはるかに大きい限り機能します。)可能な(klugey)解決策の1つは、最後に丸められた位置を記憶し、新しく計算された位置よりも真の位置に近い場合は再利用することです。(高次の外挿を試みることもできますが、式はかなりpretty
いものになり

確かに、私は小さな半径を意味しました。私の悪い。そして、追加のヒントをありがとう。そこではパフォーマンスは重要ではないので、品質を改善する余裕があります。
サムホセバル

3

一般的な物理学に基づいた世界では、それについて実際にできることはあまりありません。すべてのオブジェクトが線または特定の円に沿って移動している場合、何かをすることができます。しかし、実際の物理学の下で動作しています。オブジェクトは物理学が置く場所です。その場所のピクセルベースの近似値を描くだけです。

通常、ピクセル座標に固執したい場合は、受け入れなければならないものです。信じられないほど小さい解像度(ディスプレイのネイティブ解像度とサイズに依存しますが、640x480未満)で表示している場合を除き、あまり目立たないはずです。


高解像度であっても、レンダリングはアップスケールされ(最近隣)、オールドスクールの外観を向上させます。これは芸術的な方向性の決定です。
サムホセバー

@SamHocevar:「古い学校の外観」が必要場合は、完全な「古い学校の外観」が必要です。なぜ、「オールドスクール」のゲームが持っていたであろう階段踏みが、達成したい全体的な効果の一部ではないのですか?
ニコルボラス

まともなオールドスクールのゲームは、その階段効果を持つ斜めの動きを実装しているとは思いません。がらくたのように見えないことは、私が達成したいオールドスクール効果の大部分です:-)
サムホセバー

@SamHocevar:ほとんどの昔ながらのゲームはアクションゲームであるため、気付くほどゆっくりと移動しないでください。また、曲線に沿って移動しない傾向があります。特に私が考えていたゲームは、ソーラージェットマンでした。確かに、カメラは常にあなたの中心にあるので、あなたは世界の動きに気づきますが、それはそこにあります。
ニコルボーラス

3

保留中の動きが最後の動き(画面空間内)に対して垂直である場合、それを無視して最後の画面座標を使用します。それが階段と同じくらいひどいst音につながる場合は、保留中の移動と最後の移動の合計を移動してみてください。

問題はv <sqrt(2)にあると思います。v> sqrt(2)は、階段効果を避けて、少なくとも完全な対角線を常に移動する必要があります。事前の動きの比較が必要な剪定に役立つかもしれません。


v。Ilmariの提案の上限を指摘した+1。より詳細ですが、有用な情報を提供しています。
サムホセバー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.