2013-03-05 165 views
3

我想将用户触摸到的点坐标变换为局部对象坐标。如何将触摸坐标转换为libgdx中的局部对象坐标?

在触摸下来,我得到(X,Y)在屏幕坐标:

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

话,我camera.unproject(..)并得到(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 
    } 

} 

回答

0

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

Actor (libgdx API)

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; 
相关问题