[英]GLES 2.0 move object by screen 2D point
在openGL ES 2.0 Android中,
我需要按2D屏幕点移动对象(例如,触摸点,x = 600,y = 300)
但是,在像这样的平截头体上,
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)
。 和y
使用top相同。
因此,随着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 + (BA)*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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.