在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])。但在你的情况下,请注意你是如何定义“近”的。它应该是相对于宽度或高度,否则你在屏幕上看到什么结果可能有很大的差异取决于您所使用的设备上。 –