先写一下我的大致实现流程
鼠标单击模型,调用pick函数,来判断是否pick到了物体,并且获取模型的包围球中心和半径来作为我们这个virtual trackball的方程,哦,还要获取当前模型的位置。
然后将屏幕上的点映射到世界坐标下的球面上。
详细叙述将鼠标位置映射到球面(或曲面,当鼠标超出球的范围时的过程)
首先得到的是屏幕空间的点A,将该点转换到相机坐标系下A’(x,y,0),再将获取到的物体包围球(在世界坐标系下的)中心O,转换到相机坐标系下O’,为什么要这么做稍后再讲。然后根据O’和半径在相机空间中虚拟了trackball和曲面,然后用A’(x’,y’,z’)去求解下列方程获得z”值。于是得到在相机空间中的A’映射到球面(曲面)上的点V=(x’,y’,z”)。再将这个点V转换到世界坐标中得到V’,用V’- O(世界坐标下的包围球中心)得到映射点到trackball球心的向量V’O。
z(x,y)=⎧⎩⎨⎪⎪⎪⎪⎪⎪⎪⎪