設置我的場景(Android應用的OpenGL ES)是這樣的:OpenGL的:gluUnProject返回錯誤的座標
GLU.gluPerspective(gl, 60, viewRatio, 0.1f, 1000.0f);
// ...
GLU.gluLookAt(gl, cameraX, cameraY, cameraZ, cameraX, cameraY, cameraZ - 1f, 0f, 1f, 0f);
// Scene scaled down because object positions are in [-10000..10000] for x & y
gl.glScalef(0.001f, 0.001f, 1.0f);
渲染場景很好,它包含四邊形在z = -10和一個巨大的背景四在z = -30。現在我想實現射線採摘,像這樣(摘自this thread:
public float[] unproject(float rx, float ry, float rz) {
float[] xyzw = {0, 0, 0, 0};
int[] viewport = {0, 0, mDisplayWidth, mDisplayHeight};
android.opengl.GLU.gluUnProject(rx, ry, rz, mMatrixGrabber.mModelView, 0, mMatrixGrabber.mProjection, 0, viewport, 0, xyzw, 0);
xyzw[0] /= xyzw[3];
xyzw[1] /= xyzw[3];
xyzw[2] /= xyzw[3];
xyzw[3] = 1;
return xyzw;
}
分流到屏幕上,然後測試了這種方式:
unproject(tapX, mDisplayHeight - tapY, BACKGROUND_Z);
預期的行爲:返回的X,Y座標類似於點擊深度= -30(BACKGROUND_Z)
它實際上做了什麼:在屏幕中心點擊時返回正確的X,Y座標;但屏幕中心和點擊點之間的距離沒有被正確解釋 - 似乎被縮放d擁有某種因素。例如。點擊屏幕中心給出[0,0],點擊左邊屏幕邊緣應該給〜[-3600,0],而是給出[-1.13,0]。平移視圖,以便先前觸摸的點在屏幕中心給出〜[-3600,0],因爲它應該。
這可能是由於場景縮放0.001?我已經測試各種配置(gluLookAt之前移動縮放,或完全去除),但問題仍然存在:(在左屏幕邊緣觸摸
採樣數據輸出:
觸摸點傳遞給unproject():
x=3, y = 554 (0,0 at bottom left; w=720, h=1280)
投影矩陣:
[2.8482616, 0.0, 0.0, 0.0,
0.0, 1.7320509, 0.0, 0.0,
0.0, 0.0, -1.0001999, -1.0,
0.0, 0.0, -0.20001999, 0.0]
模型矩陣:
[0.0010, 0.0, 0.0, 0.0,
0.0, 0.0010, 0.0, 0.0,
0.0, 0.0, 1.0, 0.0,
0.0, 0.0, 1.0, 1.0]
unproject()輸出:
什麼我想到這裏,返回Z值似乎是錯的 - 傳遞到unproject Z值()是-30(如上所述)。
請問[MatrixGrabber](http://developer.android。COM /資源/樣品/ ApiDemos/SRC/COM /示例/機器人的/ apis /圖形/ spritetext/MatrixGrabber.html)包含正確的矩陣?視口是否正確?儘管齊次座標被用於模型座標,但看起來很奇怪。 – 2012-03-28 16:06:56
My MatrixGrabber具有有效的矩陣 - 不知道它們是否正常。視口總是[0,0,w,h]。你能給我一個關於同質 - >模型座標的提示嗎? – manmal 2012-03-28 18:06:05
不,這沒關係。投影部分來自投影矩陣,所有其他仿射矩陣都是由s.t.構成的。這些部分是通過的。我的猜測是,這個縮放比例在抓取者的'mModelView'中不存在。對於在你的例子中給出的矩陣操縱調用,你能顯示兩個抓取矩陣,和'gluyProject'後面的'xyzw'輸出嗎? – 2012-03-29 00:26:35