在OpenGL ES 2.0機器人,GLES 2.0移動對象
我需要移動通過2D屏幕點一個對象(例如,觸摸點,X = 600,Y = 300)
但上frustumM這樣,
Matrix.frustumM(mProjectionMatrix, 0, -ratio, ratio, -1, 1, 3, 7);
Matrix.translateM(.. X,Y,...)不能工作,因爲值是由基體尺寸過大
我怎樣才能在這個計算正確的值情況?
在OpenGL ES 2.0機器人,GLES 2.0移動對象
我需要移動通過2D屏幕點一個對象(例如,觸摸點,X = 600,Y = 300)
但上frustumM這樣,
Matrix.frustumM(mProjectionMatrix, 0, -ratio, ratio, -1, 1, 3, 7);
Matrix.translateM(.. X,Y,...)不能工作,因爲值是由基體尺寸過大
我怎樣才能在這個計算正確的值情況?
如果要移動的物體視錐矩陣圍繞你可能是最好的,在計算該對象的角度。結果應該是2個角度加上一個半徑 - 距離物體的距離。半徑可能是固定的,或者您需要從其以前的位置計算。
一旦你有兩個角度和半徑然後使用座標應被檢索近似球:
x = cos(verticalAngle)*sin(horizontalAngle)*radius
y = sin(verticalAngle)*radius
z = cos(verticalAngle)*cos(horizontalAngle)*radius
要得到你需要檢查你的視野,然後通過計算角度的角度使用點位置和屏幕大小之間的比率。
視野範圍由您的邊框座標和near
定義,例如right = tan(fov.x)*near*0.5
等fov.x = atan(right*2.0/near)
。和使用top的y
相同。
因此,與fov
你現在知道什麼是整個屏幕在x
和y
維度的角度。假設零是在屏幕的中心(如果沒有施加其它基質),那麼最左邊的部分是在-fov.x*0.5
,就在fov.x*0.5
,底部在-fov.y*0.5
,頂在fov.y*0.5
。
現在您需要計算觸摸的相對位置,具體取決於屏幕大小,如x = touch.x/screen.width
和y = touch.y/screen.height
。然後簡單地使用他們的線性插值爲T = A + (B-A)*s
:
horizontalAngle = -fov.x*0.5 + (fov.x*0.5 - -fov.x*0.5)*x
verticalAngle = fov.y*0.5 + (-fov.y*0.5 - fov.y*0.5)*y
感謝您的回覆馬蒂奇。但你的解決方案對我來說太難了。我發現另一個解決方案,設置frustumM價值屏幕x,y大小。 – pokoso
@pokoso這是做的另一種方式。另一個將是乘以按與倒截頭錐形矩陣(使用範圍的座標[-1,1])。但在你的情況下,請注意你是如何定義「近」的。它應該是相對於寬度或高度,否則你在屏幕上看到什麼結果可能有很大的差異取決於您所使用的設備上。 –