实际上,就是个焦距和视距的问题。
摄像机在不同的位置,远近切面会改变,但是fovy和aspectRatio不改变,这样,也会导致近切面的宽高发生改变。就类似于一个无限延伸的视锥体滑梯,远近切面就在这滑梯上滑动。由于最终物体要投影到近切面,而近切面是可以不断发生变化的,这样就会在拖拽时,可能划过的实际距离不相等。也就是说,起点和终点的像素差即使相等,也会实际距离可能不等。这样造成的现象,就是,在近切面太小时,托拽不动。
怎么解决呢?不同的远近切面的拖拽程度有没有一个比率呢?有的,根据相似三角形,zNear/_distance可以作为系数。因为最终要投射到近切面,而物体在_distance处是客观存在的。(当然,如果_distance如果太小了,可以再单独处理)
拖拽过程:一个push->N个Drag,->1个release组成
可以在Push的时候记录屏幕坐标
startptInViewport = ea.getX(), ea.getY()
在拖拽过程或者release的时候,再记录一个值
endPtInViewPort = ea.getX(),ea.getY(),
根据屏幕坐标转换为世界坐标公式,或者叫矩阵级联,获取世界坐标系的起点startPt和终点endPt
这两者的向量差是
deltaVec = -(endPt - startPt)/ratio,
为什么是负数呢?
因为向左拖拽,视口会向右移,所以要加负号。
这个ratio就是近切面和焦距的比值,即
ratio = zNear / _distance;
改变_center,即
_center = _center + deltaVec。
当然,在_distance很小时,也会拖拽不动,这时候可以乘以一个系数,比如
if(_distance < 0.5)
{
_ratio = _ratio/_distance;
}