https://www.khronos.org/opengl/wiki/Object_Mouse_Trackball
这是一篇翻译+碎碎念~~~翻译的不好,见谅
引言
trackball(又称 arcball)是为了复杂三维物体的旋转操作提供一个直观的用户界面(User Interface,UI 这里译成用户界面感觉怪怪的),使得旋转操作通过一个简单的虚拟的球体来实现。
球体是虚拟轨迹球的很好的选择,因为球体能够很好的包围一个物体(包围球?),并球面是光滑的,连续的,这对实现通过平滑的移动鼠标来进行平滑的旋转很重要。当然,任何光滑的,连续的形状都可以用来做trackball,只要在表面上的点能够以连续的方式被产生(映射)。
——————————————
I have a ball…ur…I have a code.. ball code….
——————————————
定义一个轨迹球,首先你要定义一个球。定义一个球心在原点的球。
x2+y2+z2=r2 其中,r是球的半径 接着,我们需要将球的中心放到我们想要旋转的物体上。需要将物体的中心映射到屏幕空间。设 (Ox,Oy) 是物体中心。因此,球的方程变成了 (x−Ox)2+(y−Oy)2+z2=r2 这样我们的球就放在了屏幕空间的原点(为什么?不是平移到了物体中心吗?),在OpenGL中,默认的屏幕空间的原点是左下角。我们可以将原点设置在屏幕中间,通过在x,y方向的平移1/2的屏幕尺寸来实现。设为C。最终的球面方程就是 (x−Cx−Ox)2+(y−Cy−Oy)2+z2=r2 —————————————————————————————— Of mice and manipulation 鼠标在屏幕上的移动轨迹映射到球面就是一条曲线。这条曲线上的每一个点和球的中心构成一个向量,然后任何两个连续的向量和球心都构成一个平面。这个平面的法相量就是我们的旋转轴,鼠标移动的两点距离决定了旋转的角度。(论立体几何的重要性) 更详细一点说,当鼠标在屏幕上移动,我们首先需要将屏幕上的点映射到球体上,就根据之前得到的球体公式 (x−Cx−Ox)2+(y−Cy−Oy)2+z2=r2 ,还有鼠标的位置x,y可以很容易得到。 这里有个问题,屏幕是矩形,球体映射到屏幕平面是一个圆,同时视锥体裁裁剪限制了球体必须有一部分是可见的,那么就会有落在这个圆形区域外的点,这样应该怎么映射呢? 球外的点可以表示为 x′2+y′2>r2 解决方法就是使用另一个曲面将球体没有覆盖的区域与球体拼接起来。 这里使用的是 z(x,y)=r2/2x2+y2−−−−−−√ 这个函数的形状像一个倒喇叭,看图,就不翻译形容了。 可以看到它几乎把轨迹球面没有覆盖到的x,y区域都覆盖了,这样映射到屏幕就可以覆盖屏幕所有位置了。 求这两个曲面相交位置的曲线,得到 x′2+y′2=r22 不想翻译了。。直接给公式了吧。。。 z(x,y)=⎧⎩⎨⎪⎪⎪⎪⎪⎪r2−(x2+y2)−−−−−−−−−−−√,r2/2x2+y2−−−−−−√if x2+y2≤r22 V1=(x1,y1,z(x1,y1))|(x1,y1,z(x1,y1))| V2=(x2,y2,z(x2,y2))|(x2,y2,z(x2,y2))| V1 V2是将屏幕上的点映射到球面上与球心形成的单位化后的向量。 N=V1×V2 θ=arccosV1⋅V2 鼠标从V1移动到V2,N是旋转轴, θ 是旋转角度。
又参考了一篇文章。 Henriksen K, Sporring J, Hornbaek K. Virtual trackballs revisited[J]. IEEE Transactions on Visualization & Computer Graphics, 2004, 10(2):206-216. 虚拟的trackball是通过二维鼠标移动来控制三维物体旋转的工具。通常,虚拟的trackball是不会显示到屏幕上的,而是假装它位于被旋转物体的中心,其半径和物体的大小是相适应的(类似包围球的感觉。所以也是通过获取包围球中心和半径来确定这个球体的方程) 如上图所示,这是从论文里面截的图,trackball可以被看做是在z轴的负半轴上的,半径为r的球,在我们的屏幕后面。 基本的数学框架如下: 将2D屏幕嵌入到三维的图形显示平面,就是图中的ImagePlane,有自己的坐标系,以屏幕中心为原点,右x,上y,外z。 屏幕上的一点 Pa=(xa,ya) 把它看做ImagePlane这个空间中的一个三维的点 Pa=(xa,ya,0) ,通过正交投影,将屏幕上的点映射到这个球面上。屏幕上鼠标的移动,就可以通过投影,转换成球面上的移动。 根据鼠标的位移来确定旋转量,旋转轴。假设鼠标从 Pa=(xa,ya,0) 移动到 Pc=(xc,yc,0) ,这里设映射方程为m,对应的球面上的点就是 P′a=m(Pa) 和 P′b=m(Pb) 如上图所示,这两个 P′a 和 P′b 和球心O,形成一段弧。 之前那篇文章看到的应该就是这篇文章列举的第三种trackball,The Bell Virtual Trackball 用这种方法的旋转比较平滑。