2013-08-31 64 views
2

我的問題:怎樣才能得到一個三維模型,以鼠標光標移動保持模型的y位置爲0(使用Libgdx)Unproject鼠標讓3D世界座標Libgdx

我已嘗試: 我試圖讓我的3D模型遵循我的光標。

目前,我只是簡單地使模型與我的鼠標的x和y座標一起移動,並添加了乘數和相機位置等因素。這不是很好,因爲它不跟隨光標,如果我旋轉相機,那麼模型不會沿正確的方向移動。

這是我用於移動模型創建的代碼:

instances.get(modelIndex).transform.setToTranslation(((Gdx.input.getX()-650)/10) + cam.position.x,0,((Gdx.input.getY()-400)/10)+ cam.position.z);

下面就這個問題的圖像的鏈接(綠色圓圈就是鼠標)。

libgx mouse

我知道我要對此錯誤的,我應該使用unproject方法。我試圖使用unproject方法,並沒有取得成功,模型只是堅持在相機的近窗格。我想我的對象停留在0上軸和y軸,所以我用這個:

cam.unproject(mousePos); 
instances.get(modelIndex).transform.setToTranslation(mousePos.x, 0, mousePos.z); 

這就導致模型中的移動很慢(不使用鼠標),在正確的方向。另外,當我旋轉或移動相機時,模型將被設置在距離或相機後面的某個位置。

回答

11

您不能簡單地使用camera.unproject,因爲單個2D座標可以表示3D空間中的多個座標。相反,您可以使用camera.getPickRay來獲取Ray,它由原點(相機的近平面上的位置)以及3D空間的方向定義。所以,你會得到在三維空間中表示二維座標系:

Ray ray = cam.getPickRay(screenX, screenY); 

現在你想在這一行(線)的點(離原點的距離),其中Y = 0:

ray.origin.y + ray.direction.y * distance = 0 <=> 
ray.direction.y * distance = -ray.origin.y <=> 
distance = -ray.origin.y/ray.direction.y 

,導致:

float distance = -ray.origin.y/ray.direction.y; 

我們獲得在這個距離上線的位置:

Vector3 tmpVector = new Vector3(); 
tmpVector.set(ray.direction).scl(distance).add(ray.origin); 

要設置模型實例轉換到該值可以使用:

instance.transform.setTranslation(tmpVector); 

這裏instance指的是你的instances.get(modelIndex)

我會鼓勵你使用InputProcessor(見http://code.google.com/p/libgdx/wiki/InputEvent),所以把它放在一起:

Vector3 tmpVector = new Vector3(); 
@Override 
public boolean touchDragged (int screenX, int screenY, int pointer) { 
    Ray ray = cam.getPickRay(screenX, screenY); 
    final float distance = -ray.origin.y/ray.direction.y; 
    tmpVector.set(ray.direction).scl(distance).add(ray.origin); 
    instance.transform.setTranslation(tmpVector); 
    return true; 
} 

請注意,您可能需要重寫touchdowntouchDragged被稱爲返回true

+0

完美,謝謝你的幫助。 – BeefCake