スプライトがカメラをlibgdxに残したかどうかを検出しますか?


8

スプライトがステージのカメラを離れたかどうかを知る方法はありますか?または私は自分の操作を行う必要がありますか?:P

回答:


5

Cameraクラスには、スプライトがカメラのフラスタム内にある場合にtrueを返すパブリックメソッドpointInFrustum(Vector3 point)を持つFrustumオブジェクトが含まれています。他のカリングテクニックについては、ユーザーWikiをご覧ください。http://code.google.com/p/libgdx-users/wiki/Culling


2
pointInFrustum(point)は、指定されたポイントがスプライトではなく、錐台内にある場合にtrueを返します。スプライトは独自の幅と高さを持つことができるため、そのメソッドを直接使用して画面内にあることを確認することはできません。
arielsan

@arielsanポイントが錐台の内部にあるかどうかを確認できる限り、スプライトの4つのポイントすべてが錐台にあるかどうかを簡単に確認できます。
TomTsagk 2018

3

タイルを使用して2Dゲームを作成している場合、独自のカリングを簡単に実装できます。これは、タイル配列内で必要なものだけを完全に消去するだけなので、はるかに安価です。

知っておくべきこと:

  • カメラの場所
  • ビューポートの幅/高さ
  • タイルの幅/高さ

これで、描画するタイルの数を計算できます。

  • 画面上の合計水平タイル= viewport.width / tileWidth
  • 画面上の合計垂直タイル= viewport.height / tileHeight

計算はすべてがどのように設定されているかによって異なりますが、非常に簡単です。たとえば、画面の中央が左上または左下のカメラ位置である場合、違いがあります。

あなたはこのようなもので終わるはずです:

int startX = cameraWorldPosX / tileWidth;
int startY = cameraWorldPosY / tileHeight;

//When you have the position of the camera in the center of the screen you do something like this:

int startX = (cameraWorldPosX - viewport.width / 2) / tileWidth;
int startY = (cameraWorldPosY - viewport.height / 2) / tileHeight;

for (int y = startY; y < startY + viewportWidth / tileWidth; y++)
{
    for (int x = startX; x < startX + viewportHeight / tileHeight; x++)
    {
        //Draw logic
    }
}

ポイントが錐台内にあるかどうかをチェックすることに対するこれの利点は、後者では、水平タイルの量と等しい設定されたタイルの量を常に反復する単純な配列を使用する代わりに、各ポイントを反復処理する必要があることです。 *実際に描画する必要がある垂直タイル。このようにして、巨大なマップを作成し、フレームレートを向上させることができます。残念ながら、これは3Dを使用する場合は難しくなり、トリッキーになりますが、ユーザーがカメラを自由に使えるようになると、指数関数的に難しくなります。キャラクターと一緒に移動する固定パースペクティブカメラが、マップを表すメッシュの配列に対して同じトリックを実行するためにハードコーディングされた変数をいくつか必要とすることを想像できます。


0

境界球チェックを使用するだけです。(ピタゴラスを使用して半径を計算できます)地獄のように速く、回転も動作します。完璧ではありませんが、誤ったカリングは発生しません。

アドホックに最適化されたバージョンの場合、Intersectorには長方形を含む長方形があり、これらも機能します。しかし、カメラの錐台の自己を長方形で計算する必要があります。


0

この関数は、アクターが表示されているかどうかをチェックします(2Dでのみ機能します)。たとえば、俳優がグループ内にいる場合など、あらゆる状況で機能します。

    /**
     * Returns if the actor is visible or not. Useful to implement 2D culling.
     **/
    public static boolean actorIsVisible(Actor actor) {
        Vector2 actorStagePos = actor.localToStageCoordinates(new Vector2(0,0));
        Vector2 actorStagePosTl = actor.localToStageCoordinates(new Vector2(
            actor.getWidth(), 
            actor.getHeight()));

        Vector3 actorPixelPos = new Vector3(actorStagePos.x, actorStagePos.y, 0);
        Vector3 actorPixelPosTl = new Vector3(actorStagePosTl.x, actorStagePosTl.y, 0);

        actorPixelPos = actor.getStage().getCamera().project(actorPixelPos);
        actorPixelPosTl = actor.getStage().getCamera().project(actorPixelPosTl);

        return !(actorPixelPosTl.x < 0 ||
                 actorPixelPos.x > Gdx.graphics.getWidth() ||
                 actorPixelPosTl.y < 0 ||
                 actorPixelPos.y > Gdx.graphics.getHeight()
                );
    }
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.