走进汉振
INTO HANCHINE
汉振分享 | 交互体验新姿势——三维轨迹球技术实现
日期:2019年08月02日

三维交互技术指在计算机中创建产品的三维模型,然后通过交互设计软件设定交互程序,使用户可以通过鼠标等交互设备实施人机交互的新兴技术。三维交互技术应用广泛,比较流行的三维软件如:Maya、3ds Max、Cinema 4D、Solidworks等。这些三维软件都涉及到相当复杂的交互内容,本文主要讨论三维交互技术中的三维轨迹球的实现。


三维模型中主要理解3个坐标系:世界坐标系,物体坐标系和摄像机坐标系:

世界坐标系主要用于描述其他坐标系的位置,被广泛的称为全局坐标系或者宇宙坐标系,描述的是整个场景中的所有的对象,可以理解为绝对坐标系

物体坐标系是针对特定的物体而建立的独立坐标系,当物体发生变化的时候,相当于它本身的坐标系相对于世界坐标系发生变化的过程。

摄像机坐标系是和观察者密切相关的坐标系,摄像机坐标系和屏幕坐标系类似,差别在于摄像机坐标系处于3D空间中,而屏幕坐标系在2D平面中。 摄像机坐标系描述的问题主要包括物体是否在摄像机坐标系的区域中,物体的渲染顺序和物体的遮挡绘制。

模型视图矩阵相当于是调整拍照时相机的位置,来确认模型和相机中的相对位置,其中视图矩阵是相对于相机而言的,模型矩阵是相对于物体而言的。模型变换指在物体坐标系下,进行的平移,旋转,缩放的变换操作。视图变换是模型变换的逆矩阵,是将物体坐标系变换到摄像机坐标系的过程。与模型变换相反。

投影变换相当于拍照时通过选择镜头和调整焦距等,将景物投射到二维底片的过程。投影变换的目的是产生一个视景体。
视景体有两个作用:
(1)决定一个物体如何映射到屏幕(透视投影:棱台装视景体,又称视锥体;正投影:立方体,平行视景体)。
(2)决定哪些物体(或物体的某一部分)被裁减到最终的图像之外。
其中投影的方式又分为:
(1)透视投影:离照相机近的物体大,离照相机远的物体小。
(2)正投影:物体和照相机之间的距离不影响它看上去的实际大小。

将投影变换得到的结果反映到指定的屏幕窗口上去,场景最终变换到了窗口坐标系中。

如图1所示,世界坐标变换到屏幕坐标需要的矩阵变化。首先定义世界坐标系下的一个点为pWorld。通过相机获取它的视图矩阵为mViewMatrix,投影矩阵为mProjectionMatrix,视口矩阵为mViewPortMatrix。则定义屏幕中的点为pScreen。

当世界坐标转换到屏幕坐标系的时候,可以通过换算得到pScreen,即换算过后屏幕上的点的位置。


当屏幕坐标系转换到世界坐标系的时候,可以通过换算得到pWorld,即换算过后屏幕上的点的位置。


虚拟轨迹球的目的是,通过平滑的移动鼠标来进行三维的平移旋转等的变换过程,将球体作为虚拟轨迹球的选择有一定的优点,球体是很好的包围物体,球体的表面是光滑连续的,可以保证表面上的点能够以连续的方式被产生,这样就可以和屏幕上的点映射。

首先定义一个轨迹球,定义一个球心在原点的球:


其中,r是球的半径。

接着,需要将球的中心放到我们想要旋转的物体上,需要将物体的中心映射到屏幕空间,设(Ox,Oy)是物体中心。因此,球的方程变成了:


这样我们的球就放在了屏幕空间的原点,在OpenGL中,默认的屏幕空间的原点是左下角。我们可以将原点设置在屏幕中间,通过在x,y方向的平移1/2的屏幕尺寸来实现,设为C。最终的球面方程就是:


注意,这里的(x,y),(Ox,Oy),(Cx,Cy)都是世界坐标系下面的,进行计算的过程中,需要将屏幕中的屏幕坐标,换算到世界坐标系,来进行计算。


关于如何从屏幕坐标如何映射到球面坐标这部分,主要是通过计算视椎体中的近视场交点和远视场交点。这部分可以通过屏幕坐标点P左乘视图矩阵的逆矩阵,投影矩阵的逆矩阵,视口矩阵的逆矩阵,来得到近视场和远视场的点。并通过这二个点形成的直线计算轨迹球与该射线的交点,得到映射点。图2表示投影的近平面和远平面。


鼠标在屏幕上的移动轨迹映射到球面就是一条曲线。这条曲线上的每一个点和球的中心构成一个向量,然后任何两个连续的向量和球心都构成一个平面。这个平面的法相量就是我们的旋转轴,鼠标移动的两点距离决定了旋转的角度。如图3、图4。

更详细一点说,当鼠标在屏幕上移动,我们首先需要将屏幕上的点映射到球体上,就根据之前得到的球体公式:


还有鼠标的位置x,y可以很容易得到。


这里有个问题,屏幕是矩形,球体映射到屏幕平面是一个圆,同时视锥体裁裁剪限制了球体必须有一部分是可见的,那么就会有落在这个圆形区域外的点,这样应该怎么映射呢? 球外的点可以表示为:


解决方法就是使用另一个曲面将球体没有覆盖的区域与球体拼接起来。 这里使用的是:


这个函数的形状像一个倒喇叭。


如图5所示,可以看到它几乎把轨迹球面没有覆盖到的x、y区域都覆盖了,这样映射到屏幕就可以覆盖屏幕所有位置了。

求这两个曲面相交位置的曲线,得到:


通过相加的曲线函数求得屏幕上的点映射到球面上的球心形成的单位化后的向量V1,V2。


通过V1,V2获取这二个向量的法向量。该法向量就是虚拟轨迹球操控模型需要旋转的轴。


通过旋转轴,以及所知道向量计算出旋转的角度θ。


鼠标通过到papc,通过映射到轨迹球的PaPc,然后和轨迹球的原点形成V1和V2向量,轨迹球的从V1移动到V2,N是旋转轴,θ是旋转角度。

由此,就可以将鼠标在屏幕中的平移变换到模型绕着向量N旋转θ的交互操作等价起来,这部分的旋转可以通过四元数来变换,实现了通过轨迹球旋转模型的姿势。


        更多机器视觉分享,欢迎关注微信公众号“汉振智能”....