2013-03-05 66 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; 
相關問題