如何平滑地将球体变换为半球体

时间:2010-10-07 03:30:04

标签: math animation graphics rotation

我正在使用第三方“旋转器”物体,它沿球体表面提供平滑,随机的旋转。旋转器用于控制摄像机(请参阅xscreensaver源代码中的rotator.h / c。)

旋转器的输出是纬度和经度。 我想要的是让相机保持在“赤道”之上 - 因此仅限于半球。

我宁愿不修改旋转器本身。所以我可以取纬度输出并使用它的绝对值。然而,横跨赤道的平滑旋转运动不会产生平稳的相机运动:它会反弹。

我想我可以将旋转器的输出范围从其当前范围缩放到我的目标范围:例如f(lat)=(lat + 1)/ 2将(0,1)范围映射到(0.5,1)。即将整个“地球仪”映射到北半球。运动仍然很顺利。但是,旋转器的“南极”将成为我相机的“赤道”。这不会导致奇怪的动作吗?也许不连续?我不确定。

还有另一种方法可以将球体(纬度和经度)平滑地映射到半球吗?

更新

感谢您的关注和回应。有几个人要求澄清“顺利”。我的意思是不生涩:旋转器速度的微小变化应映射到相机速度的微小变化。如果我只是取纬度的绝对值,那么当旋转器越过赤道时,旋转器速度的零变化将转换为摄像机速度的突然符号翻转(也就是反弹)。

IIRC这相当于要求速度的一阶导数是连续的。连续的二阶导数可能不错,但我认为这不是必需的。

4 个答案:

答案 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)

我不完全确定我理解你的问题,所以我会重新陈述以防万一:

  

您希望能够转换任何点(由纬度和经度给出)并将其转换为半球上的点,以便“移动平滑”(即球体上的小移动转换为半球)

在这种情况下,我相信你可以简单地“将球体向后折叠”(例如,取自赤道的纬度模数)。