我很新并尝试使用Apple的ARKit,并对ARCamera的旋转信息有疑问。我正在拍摄照片,并在拍摄每张照片时保存相机的当前位置,方向和旋转。我们的想法是创建具有这些图像的2d平面节点,并使它们以相同的位置/方向/旋转(相对于原点)出现在另一个视图中,就像捕获它们时一样(就好像图像在空中被冻结一样)他们被抓获了)。位置信息似乎工作正常,但方向/旋转完全关闭,因为我很难理解何时使用self.sceneView.session.currentFrame?.camera.eulerAngles vs 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.x
获取图像的视图中获取的值(对于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获取的信息是否足以捕获图像的正确方向?
我的方法是完全错误的还是我错过了一些明显的东西?任何帮助将不胜感激!
答案 0 :(得分:1)
如果您想要做的事实上是创建一个在捕获时面向相机的广告牌,那么您基本上可以采用相机的变换矩阵(它已经具有正确的方向)并且只应用反向平移它将它移动到对象位置。他们使用该矩阵来定位您的广告牌。这样您就不必处理任何角度或担心合成旋转的正确顺序。翻译很容易,因为您需要做的就是从相机的位置减去对象的位置。其中一个ARkit WWDC会话实际上有一个例子(它在摄像机的位置创建了广告牌)。你需要做的唯一改变是将广告牌转移到相机的位置。