3

我很新,正在尝试使用 Apple 的 ARKit,并且对 ARCamera 的旋转信息有疑问。我正在拍摄照片并在拍摄每张图像时保存相机的当前位置、方向和旋转。这个想法是用这些图像创建 2d 平面节点,并让它们出现在另一个视图中,其位置/方向/旋转(相对于原点)与它们被捕获时相同(就好像图像在他们被俘虏了)。位置信息似乎工作正常,但方向/旋转完全消失,因为我很难理解何时使用 self.sceneView.session.currentFrame?.camera.eulerAngles 与 self.sceneView.pointOfView? .orientation vs self.sceneView.pointOfView?.rotation。

这就是我设置二维图像平面的方式:

let imagePlane = SCNPlane(width: self.sceneView.bounds.width/6000, height: self.sceneView.bounds.height/6000)
imagePlane.firstMaterial?.diffuse.contents = self.image//<-- UIImage here
imagePlane.firstMaterial?.lightingModel = .constant
self.planeNode = SCNNode(geometry: imagePlane)

然后我将 设置为self.planeNode.eulerAngles.x我从使用self.sceneView.session.currentFrame?.camera.eulerAngles.xx 捕获图像的视图中获得的值(并对 y 和 z 执行相同的操作)。

然后我将节点的旋转设置为self.planeNode.rotation.x = self.rotX(其中 self.rotX 是我从中获得的信息self.sceneView.pointOfView?.rotation.x)。

我也尝试将其设置如下:

let xAngle = SCNMatrix4MakeRotation(Float(self.rotX), 1, 0, 0); 
let yAngle = SCNMatrix4MakeRotation(Float(self.rotY), 0, 1, 0);
let zAngle = SCNMatrix4MakeRotation(Float(self.rotZ), 0, 0, 1);
let rotationMatrix = SCNMatrix4Mult(SCNMatrix4Mult(xAngle, yAngle), zAngle);
self.planeNode.pivot = SCNMatrix4Mult(rotationMatrix, self.planeNode.transform);

文档指出 eulerAngles 是相机在滚动、俯仰和偏航值方面的“方向”,但是 self.sceneView.pointOfView?.orientation 是用来做什么的?

因此,当我指定平面节点的位置、方向和旋转时,我从 eulerAngles 获得的信息是否足以捕获图像的正确方向?

我的方法是完全错误的还是我遗漏了一些明显的东西?任何帮助将非常感激!

4

1 回答 1

2

如果您想要做的实际上是在捕获时创建一个面向相机的广告牌,那么您基本上可以采用相机的变换矩阵(它已经具有正确的方向)并对其应用反向平移以移动它到对象的位置。他们使用该矩阵来定位您的广告牌。这样您就不必处理任何角度或担心合成旋转的正确顺序。翻译很容易,因为您需要做的就是从相机的位置中减去对象的位置。其中一个 ARkit WWDC 会议实际上有一个类似的示例(它在相机的位置创建广告牌)。您需要做的唯一更改是将广告牌从摄像头的位置移开。

于 2018-01-17T13:11:12.977 回答