我有一个SCNView,里面包含了一个位于相机根节点前方的SCNPlane几何形状的SCNNode。
在UIView中展示SCNView时,我添加了一些UIImages(标记)- 橙色圆圈。
在Motion监听器中,我试图将这些标记定位在平面每个边缘的中心位置。
我是通过从SceneKit对象到UIView的投影来实现这一点的:
//world coordinates
let v1w = sm.node.convertPosition(sm.node.boundingBox.min,
to: self.sceneView.scene?.rootNode)
let v2w = sm.node.convertPosition(sm.node.boundingBox.max,
to: self.sceneView.scene?.rootNode)
//projected coordinates
let v1p = self.sceneView.projectPoint(v1w)
let v2p = self.sceneView.projectPoint(v2w)
//frame rectangle
let rect = CGRect.init(x: CGFloat(v1p.x), y: CGFloat(v2p.y),
width: CGFloat(v2p.x - v1p.x), height: CGFloat(v1p.y - v2p.y))
var frameOld = sm.marker.frame
switch sm.position
{
case .Top:
frameOld.origin.y = rect.minY - frameOld.size.height/2
frameOld.origin.x = rect.midX - frameOld.size.width/2
case .Bottom:
frameOld.origin.y = rect.maxY - frameOld.size.height/2
frameOld.origin.x = rect.midX - frameOld.size.width/2
case .Left:
frameOld.origin.y = rect.midY - frameOld.size.height/2
frameOld.origin.x = rect.minX - frameOld.size.width/2
case .Right:
frameOld.origin.y = rect.midY - frameOld.size.height/2
frameOld.origin.x = rect.maxX - frameOld.size.width/2
}
sm.marker.frame = frameOld
self.view.layoutSubviews()
你可以在这里找到类似的方法:Scene Kit: projectPoint calculated is displaced
我希望这些标记能够在设备运动期间固定在平面边缘。但问题是:当旋转设备时,标记会从平面边缘漂移
查看问题视频:https://youtu.be/XBgNDDX5ZI8
我在github上创建了一个基本项目来重现这个问题:https://github.com/mgontar/SceneKitProjectionIssue