gpt4 book ai didi

ios - 如何根据相机的位置变换图像

转载 作者:可可西里 更新时间:2023-11-01 05:57:07 25 4
gpt4 key购买 nike

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

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

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. using an identity matrix (as the CATransform3D parameter) with .m34 set to 1/-1000,
  2. rotating my image by the angle of φ with the (0, 1, 0) vector,
  3. concatenating the result with a rotation by θ and the (1, 0, 0) vector,
  4. scaling based on the d is ignored (I scale the image based on some other criteria).

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

最佳答案

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

那么如果坐标系是这样的: enter image description here

而待变换图像的平面过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 方法的参数。

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

关于ios - 如何根据相机的位置变换图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12030715/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com