4

我正在尝试根据外观方向创建图像的透视投影。我在这个领域没有经验,但是我自己无法做到这一点。请你帮帮我好吗?

有一个图像和一个观察者(相机)。如果相机可以被认为是一个不可见球体上的物体,而图像是一个穿过球体中间的平面,那么相机位置可以表示为:

x = d cos(θ) cos(φ)

y = d sin(θ)

z = d sin(φ) cos(θ)

其中 θ 是纬度,φ 是经度,d 是距图像中心所在球体中心的距离(半径)。

我在某个地方找到了这些公式,但我不确定坐标(我不知道,但在我看来 x 应该是 z,但我想它取决于坐标系)。

现在,我需要做的是对我的图像进行适当的转换,使其看起来好像是从相机(以正确的视角)观看的。你能告诉我几句话,这是怎么做到的吗?我应该采取哪些步骤?

我正在开发一个 iOS 应用程序,我想我可以使用 QuartzCore 中的以下方法。但我不知道我应该将什么角度传递给这个方法,以及如何从相机位置推导出新的 x、y、z 坐标。

CATransform3D CATransform3DRotate (CATransform3D t, CGFloat angle,
    CGFloat x, CGFloat y, CGFloat z)

到目前为止,我已经通过以下方式成功创建了一个简单的查看透视图:

  1. 使用 .m34 设置为 1/-1000 的单位矩阵(作为 CATransform3D 参数),
  2. 使用 (0, 1, 0) 向量将我的图像旋转 φ 的角度,
  3. 将结果与旋转 θ 和 (1, 0, 0) 向量连接起来,
  4. 基于 d 的缩放被忽略(我根据其他一些标准缩放图像)。

但是我得到的结果不是我想要的(这很明显):-/。只要这两个角度中的一个接近 0,透视图看起来就很逼真。因此我认为有一种方法可以以某种方式计算出适当的角度以及 x、y 和 z 坐标以实现适当的变换(这可能是错误的,因为这只是我的猜测)。

4

1 回答 1

2

我想我设法找到了解决方案,但不幸的是基于我自己的计算、想法和实验,所以我不知道它是否正确。似乎还可以,但你知道...

所以如果坐标系是这样的: 在此处输入图像描述

待变换图像的平面经过X轴和Y轴,其中心在系统原点,则坐标如下:

x = d sin(φ) cos(θ)

y = d sin(θ)

z = d cos(θ) cos(φ)

定义一个向量,该向量从坐标系的原点开始,指向正在观察图像的相机的位置。d可以设置为 1,因此我们无需进一步归一化即可立即获得单位向量。Theta 是 ZY 平面中的角度,phi 是 ZX 平面中的角度。Theta 从 Z+ 到 Y+ 轴从 0° 上升到 90°,而 phi 从 Z+ 到 X+ 轴从 0° 上升到 90°(并且在两种情况下都在相反的方向上上升到 -90°)。

因此变换向量为:

x1 = -y / z

y1 = -x / z

z1 = 0。

我不确定 z1 = 0,但是围绕 Z 轴的旋转对我来说似乎是错误的。

最后要计算的是图像必须转换的角度。在我看来,这应该是指向相机的向量 (x, y, z) 和垂直于图像的向量之间的角度,即 Z 轴 (0, 0, 1)。

两个向量的点积给出了它们之间夹角的余弦,所以夹角为:

α = arccos(x * 0 + y * 0 + z * 1) = arccos(z)。

因此,alpha 角度和 x1、y1、z1 坐标是我在问题中提到的 CATransform3DRotate 方法的参数。

如果有人能告诉我这种方法是否正确,我将不胜感激。非常感谢!

于 2012-08-21T22:42:49.910 回答