我想将用户触摸时收到的点坐标转换为局部对象坐标。
按下触摸我在屏幕坐标中得到(x,y):
left-top=(0,0), bottom-right=(SCREEN_WIDTH,SCREEN_HEIGHT).
然后我做camera.unproject(..)
并得到(x,y)世界坐标(ViewPort),但我不知道如何将获取点转换为局部对象坐标。我尝试了一些操作(参见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
}
}
答案 0 :(得分: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;
答案 1 :(得分:0)
最快捷的方法是MyRect
延长Actor
并使用Actor.stageToLocalCoordinates()
。如果您不想继承Actor
,请获取libgdx源代码并查看上述方法。