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

4
我正在使用第三方的“旋转器”对象,它提供了一个平滑的随机旋转,沿着球体表面。该旋转器用于控制相机(请参见xscreensaver中源代码中的rotator.h/c)。
旋转器的输出是纬度和经度。我想让相机保持在“赤道”上方-因此仅限于半球。
我不想修改旋转器本身。因此,我可以获取纬度输出并使用其绝对值。然而,赤道上的平滑旋转器运动将不能产生平滑的相机运动:它会弹跳。
我想,我可以将旋转器的输出纬度从其当前范围缩放到我的目标范围:例如f(lat) =(lat + 1)/ 2将(0,1)范围映射到(0.5,1)。即将整个“地球”映射到北半球。运动仍然会很平滑。但是由旋转器指定的“南极”将成为相机的“赤道”。那样会产生奇怪的运动吗?可能有不连续性吗?我不确定。
还有其他方法可以将球体(纬度和经度)平滑地映射到半球吗?
更新:
感谢您的关注和回复。一些人要求对“平滑”进行澄清。我的意思是不会抖动:旋转器速度的微小变化应映射为相机速度的微小变化。如果我只取纬度的绝对值,则旋转器在穿过赤道时速度的零变化将转换为相机速度的突然符号翻转(也称为弹跳)。
如果我没记错,这相当于要求速度的一阶导数连续。连续的二阶导数可能很好,但我认为这并非必要。

你需要说明什么是“平滑”的运动。想象一下,旋转器的输出描述了一个类似于从地球上的非北极点观察太阳所采取的路径。在日落时,你希望你的相机做什么? - AakashM
@AakashM: 我不太清楚,我正在寻找想法,只要动作不会很突兀。例如,如果相机向东行驶,则使用柔和的加速/减速反转并向西返回。我很满意ysap的建议。 - LarsH
4个回答

4
速度是位置的导数。仅仅“镜像”纬度值时,当到达赤道时会在位置函数中创建一个“拐角”。因此,为了获得平滑的过渡,您需要将线性位置(即时间的纬度函数)映射到靠近赤道变化缓慢且一阶导数在赤道处为0的函数。 tom10 提出的映射 lat'(lat) = (lat)^2 是这种函数的很好的例子。但是,您需要对结果进行归一化,以便获得 lat'(90deg) = 90deg。因此,正确的映射应该是: lat'(lat) = 90*(lat/90)^2 除了抛物线之外,还可以使用适当的移位和归一化的正弦函数。根据您希望速度与赤道“远离”时接近原始速度的程度,可以具有更高或更低的指数值,例如: lat'(lat) = 90*( |lat| / 90)^K

谢谢!我会尝试n^2和sin两种建议。 - LarsH

1
一个球体和一个半球体在拓扑上是不同的,因此没有办法以一种满足您的要求的方式平滑地映射两者之间的关系。

不要啊!(-1) - 一个球体和一个半球在拓扑上是等价的。 - Justin
糟糕,我的错 - 它们不是拓扑等价的(抱歉)。 - Justin
1
抱歉,但我不同意你的观点。据我理解,OP的标准并不需要纬度导数的一对一映射,因此存在一个平滑的映射,正如Tom10和我所建议的那样。 - ysap
@ysap,@Ignacio:正确的,不需要导数的一对一映射,只需要平滑映射。 - LarsH

1

你可以使用柔和的方式代替纬度的绝对值,例如 (纬度)2


好建议...为什么我没想到那么简单的事情。 :-) - LarsH

0

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

您想能够将任何点(由纬度和经度给出)转换为半球上的一个点,以便“移动平稳”(即球体上的小移动转化为半球上的小移动)

在这种情况下,我认为您可以简单地“将球体折叠回来”(例如,将纬度关于赤道取模)。


但这正是OP试图避免的。想象一下以恒定速度从北半球越过赤道到达南半球的情况。在“镜像”变换中,速度将突然从负数变为正数,保持速度大小不变。这将导致OP提到的“弹跳”效应。 - ysap
抱歉,我以为“运动平滑”很清楚了,但我会编辑我的问题以澄清。不仅是小的运动会转化为小的运动,而且小的速度变化(dv)也会转化为小的速度变化(dv)。 - LarsH

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接