我正在使用第三方“旋转器”物体,它沿球体表面提供平滑,随机的旋转。旋转器用于控制摄像机(请参阅xscreensaver源代码中的rotator.h / c。)
旋转器的输出是纬度和经度。 我想要的是让相机保持在“赤道”之上 - 因此仅限于半球。
我宁愿不修改旋转器本身。所以我可以取纬度输出并使用它的绝对值。然而,横跨赤道的平滑旋转运动不会产生平稳的相机运动:它会反弹。
我想我可以将旋转器的输出范围从其当前范围缩放到我的目标范围:例如f(lat)=(lat + 1)/ 2将(0,1)范围映射到(0.5,1)。即将整个“地球仪”映射到北半球。运动仍然很顺利。但是,旋转器的“南极”将成为我相机的“赤道”。这不会导致奇怪的动作吗?也许不连续?我不确定。
还有另一种方法可以将球体(纬度和经度)平滑地映射到半球吗?
更新
感谢您的关注和回应。有几个人要求澄清“顺利”。我的意思是不生涩:旋转器速度的微小变化应映射到相机速度的微小变化。如果我只是取纬度的绝对值,那么当旋转器越过赤道时,旋转器速度的零变化将转换为摄像机速度的突然符号翻转(也就是反弹)。
答案 0 :(得分:4)
速度是位置的导数。只需“镜像”lat值,就可以在击中赤道时在位置函数中创建一个“角”。因此,为了获得平滑过渡,您需要将线性位置(即,纬度作为时间的函数)映射到在赤道附近缓慢变化的函数,并且在赤道处一阶导数为0。
tom10 建议映射 lat'(lat)=(lat)^ 2 是这种函数的一个很好的例子。但是,您需要对结果进行标准化,以便获得 lat'(90deg)= 90deg 。因此,正确的映射应该是:
lat'(lat)= 90 *(lat / 90)^ 2
抛物线的替代方案是 sin()函数,具有适当的移位和规范化。根据您在离开赤道时希望速度接近原始速度的程度,您可以使用更高或更低阶的指数值,例如:
lat'(lat)= 90 *(| lat | / 90)^ K
答案 1 :(得分:1)
球体和半球在拓扑上是不同的,因此无法以满足您标准的方式在两者之间平滑地进行映射。
答案 2 :(得分:1)
而不是纬度的绝对值,你可以做一些平滑的事情,比如(latitiude) 2 。
答案 3 :(得分:0)
我不完全确定我理解你的问题,所以我会重新陈述以防万一:
您希望能够转换任何点(由纬度和经度给出)并将其转换为半球上的点,以便“移动平滑”(即球体上的小移动转换为半球)
在这种情况下,我相信你可以简单地“将球体向后折叠”(例如,取自赤道的纬度模数)。