【发布时间】:2015-08-31 12:22:46
【问题描述】:
我有一个关于在一组 3D 点上投影图像的问题。该图像以 JPG 格式提供给我,以及相机相对于笛卡尔坐标系(Xc、Yc、Zc 和偏航、俯仰、滚动)的位置和姿态信息,以及水平和垂直视野(度数)。
仅使用它们在同一坐标系 (Xp,Yp,Zp) 中的 3d 位置给出点。
在我的坐标系中,Z 向上。要将图像投影到点上,我
-
计算从相机到每个点的向量
Vector3 c2p = (Xp,Yp,Zp)-(Xc,Yc,Zc); -
根据我相机的姿态(四元数)旋转 c2p:
Vector3 c2pCamFrame = getCamQuaternion().conjugate().rotate(c2p); -
计算从相机的“中心射线”到该点的方位角和仰角:
float azimuth = atan2(c2pCamFrame.x(),c2pCamFrame.y())); float elevation = atan2(c2pCamFrame.z(),sqrt(pow(c2pCamFrame.x(),2)+pow(c2pCamFrame.y(),2))); 如果方位角和仰角在视野范围内,我将相应像素的颜色分配给该点。
我无法弄清楚为什么投影的高度会失真。在图像的右下角,您可以看到平截头体之外的点(超过仰角)实际上变成了彩色 - 这种失真在 0 度的方位角处为零,并且在图像的左右边缘处达到峰值,从而创建枕头变形。
为什么会出现这种失真?我很想用几何和数学术语来理解这个问题。谢谢!
【问题讨论】:
-
看起来像精度问题您使用浮点数吗? 32/64/80/128 位?点和相机的坐标值是多少 视锥体的 FOV 是多少(角度、znear、zfar)。您将每个点的许多测角函数堆叠在一起可能更好的是构造单个变换矩阵(以高精度计算)并将其用于所有点,如果您的位置动态范围很高,那么它可能会导致失真。建议使用至少 64 位浮点类型和尽可能精确的测角函数(尤其是对于 atan2)
-
@Spektre,我不认为这是一个精确的问题。是的,我在所有地方都使用 32 位浮点数,但是对于示例中显示的所有点,c2p 的长度小于 200。Fov 度数是 45h 和 30v。我究竟会在哪里失去如此多的精度,以至于我的高度偏离了这么多?
-
c2p是相对值 全球的绝对值是多少?如果您要减去1000000000200.0-1000000000000.0=200.0之类的内容,那么这是精确的事情,如果不是,那么问题可能出在其他地方。由于您没有提供示例案例数据,我们只能猜测。嵌套太多的测角函数也会对此产生负面影响......另一件事是你是如何渲染这些图像的(使用另一个投影?)问题可能也存在......
标签: graphics 3d computational-geometry projection