4

我想将用户触摸时收到的点坐标转换为本地对象坐标。

触地时,我在屏幕坐标中得到 (x,y):

left-top=(0,0), bottom-right=(SCREEN_WIDTH,SCREEN_HEIGHT).

然后我camera.unproject(..)在世界坐标(ViewPort)中获取(x,y),但我不知道如何将获取的点转换为本地对象坐标。我尝试了一些操作(请参阅 中的注释MyRect.unproject(..)),但它们都不起作用。

public class MyLibgdxGame extends Game implements InputProcessor {
    private MyRect obj;
    ...
    public void render() {
        camera.update();

        Gdx.gl.glClearColor(.1f,.1f,.1f,1);
        Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT);

        renderer.setProjectionMatrix(camera.combined);

        renderer.begin(ShapeRenderer.ShapeType.Line);
        renderer.setColor(Color.GREEN);
        renderer.line(0,0, 0, 30);
        renderer.setColor(Color.BLUE);
        renderer.line(0,0, 30, 0);
        renderer.end();

        obj.render(renderer);
    }

    public void resize(int width, int height) {
        float units = 100f;
        float aspectRatio = (float) width / (float) height;
        camera = new OrthographicCamera(units * aspectRatio, units);
        camera.update();
    }

    public boolean touchDown(int screenX, int screenY, int pointer, int button) {
        Gdx.app.log("my", String.format("[Touch] x: %d, y: %d", screenX, screenY));
        Vector3 v = new Vector3(screenX, screenY, 0);
        camera.unproject(v);
        Gdx.app.log("my", String.format("[S to VP] x: %.1f, y: %.1f", v.x, v.y));

        // !! convert world coordinate "v" to local object coordinate
        obj.unproject(v);
        Gdx.app.log("my", String.format("[VP to Object] x: %.1f, y: %.1f", v.x, v.y));

        return false;
    }
    ...
}

public class MyRect {

    private Rectangle rect;
    private float angle;
    private Matrix4 transform;

    public MyRect(float x, float y, float w, float h, float angle) {
        this.rect = new Rectangle(x, y, w, h);
        this.angle = angle;

        transform = new Matrix4().translate(x,y,0).rotate(0,0,1,angle);
    }

    public void render(ShapeRenderer renderer) {

        renderer.identity();
        renderer.setTransformMatrix(transform);

        renderer.begin(ShapeRenderer.ShapeType.Rectangle);
        renderer.setColor(Color.RED);
        renderer.rect(0, 0, rect.width, rect.height);
        renderer.end();

        r.begin(ShapeRenderer.ShapeType.Line);
        r.setColor(Color.GREEN);
        r.line(0,0, 0, 30);
        r.setColor(Color.BLUE);
        r.line(0,0, 30, 0);
        r.end();

        renderer.identity();
    }

    public Vector3 unproject(Vector3 v) {
//      return v.mul(transform); // 1
//      return v.prj(transform); // 2
        return v.rotate(0,0,1,angle).sub(new Vector3(rect.x, rect.y, 0)); //3
    }

}
4

2 回答 2

2

你搞错了。

camera.unproject(v);
Gdx.app.log("my", String.format("[S to VP] x: %.1f, y: %.1f", v.x, v.y));

// !! convert world coordinate "v" to local object coordinate
obj.unproject(v);
Gdx.app.log("my", String.format("[VP to Object] x: %.1f, y: %.1f", v.x, v.y));

您所说的“本地坐标”是相机坐标。当您取消投影触摸时,您会将屏幕坐标转换为相机坐标。但是你想要的是世界坐标。无需取消投影您的对象,因为这会给您一个无用的向量。只需将您的相机坐标转换为世界坐标并使用这些坐标:

camera.unproject(v);
Gdx.app.log("my", String.format("[S to VP] x: %.1f, y: %.1f", v.x, v.y));
x = camera.position.x-camera.viewportWidth+v.x;
y = camera.position.y-camera.viewportHeight+v.y;
于 2014-01-10T08:31:59.237 回答
0

最快的方法是MyRect扩展Actor和使用Actor.stageToLocalCoordinates()。如果您不想子类Actor化,请获取 libgdx 源并查看上述方法。

演员(libgdx API)

于 2013-09-04T23:28:12.093 回答