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

我正在尝试根据外观方向创建图像的透视投影.然而,我在这个领域缺乏经验,无法自己做到这一点.你能帮帮我吗?

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

x = d cos(θ) cos(φ)

y = d sin(θ)

z = d sin(φ) cos(θ)

其中θ是纬度,φ是经度,d是距图像中间的球体中间的距离(半径).

我发现这些公式在哪里,但我不确定坐标(我不知道,但它看起来我应该是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坐标以实现正确的变换(这可能是错误的,因为这只是我的猜测).

最佳答案 我想我设法找到了解决方案,但不幸的是基于我自己的计算,想法和实验,所以我不知道它是否正确.似乎没问题,但你知道……

所以如果坐标系是这样的:

并且要变换的图像平面穿过X轴和Y轴,其中心位于系统的原点,然后是以下坐标:

x = d sin(φ) cos(θ)

y = d sin(θ)

z = d cos(θ) cos(φ)

定义一个从坐标系原点开始并指向观察图像的摄像机位置的矢量. d可以设置为1,因此我们可以立即获得单位向量而无需进一步标准化. θ是ZY平面中的角度,phi是ZX平面中的角度. θ从Z轴到Y轴从0°升高到90°,而phi从Z轴升高到90°到X轴(在两种情况下都是相反方向的-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方法的参数.

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

点赞