相机不在Scenekit中跟踪飞机

我有一个飞行的飞机,我正在跟踪,我也显示了飞机已经跟随的道路。 我正在绘制圆柱体作为绘制path的线。 它的types在2点之间画线。 我有一个最初设置为(0,200,200)的cameraNode。 那时我可以看到飞机。 但是当我开始我的飞行。 它走出屏幕。 我想要2件事情:

  1. 只要按照飞机(path无关紧要)。
  2. 显示整个path,也是飞机。

我试图find最小广告最大x,y和z和平均值,但它没有工作。 如果你看到下面的gif太缩放,飞机已经移出屏幕

以下是我如何设置我的相机:

- (void)setUpCamera { SCNScene *workingScene = [self getWorkingScene]; _cameraNode = [[SCNNode alloc] init]; _cameraNode.camera = [SCNCamera camera]; _cameraNode.camera.zFar = 500; _cameraNode.position = SCNVector3Make(0, 60, 50); [workingScene.rootNode addChildNode:_cameraNode]; SCNNode *frontCameraNode = [SCNNode node]; frontCameraNode.position = SCNVector3Make(0, 100, 50); frontCameraNode.camera = [SCNCamera camera]; frontCameraNode.camera.xFov = 75; frontCameraNode.camera.zFar = 500; [_assetActivity addChildNode:frontCameraNode]; //_assetActivity is the aircraft node. 

}

这是我如何改变不工作的相机位置:

 - (void)showRealTimeFlightPath { DAL3DPoint *point = [self.aircraftLocation convertCooridnateTo3DPoint]; DAL3DPoint *previousPoint = [self.previousAircraftLocation convertCooridnateTo3DPoint]; self.minCoordinate = [self.minCoordinate findMinPoint:self.minCoordinate currentPoint:point]; self.maxCoordinate = [self.minCoordinate findMaxPoint:self.maxCoordinate currentPoint:point]; DAL3DPoint *averagePoint = [[DAL3DPoint alloc] init]; averagePoint = [averagePoint averageBetweenCoordiantes:self.minCoordinate maxPoint:self.maxCoordinate]; SCNVector3 positions[] = { SCNVector3Make(point.x,point.y,point.z) , SCNVector3Make(previousPoint.x,previousPoint.y,previousPoint.z) }; SCNScene *workingScene = [self getWorkingScene]; DALLineNode *lineNodeA = [[DALLineNode alloc] init]; [lineNodeA init:workingScene.rootNode v1:positions[0] v2:positions[1] radius:0.1 radSegementCount:6 lineColor:[UIColor greenColor]] ; [workingScene.rootNode addChildNode:lineNodeA]; self.previousAircraftLocation = [self.aircraftLocation mutableCopy]; self.cameraNode.position = SCNVector3Make(averagePoint.x, averagePoint.y, z); self.pointOfView = self.cameraNode; 

}

快速或客观的代码欢迎。

谢谢!!

你所描述的第一个行为最容易通过链接面向飞机的查看约束和距离约束来实现。

 let lookAtConstraint = SCNLookAtConstraint(target: aircraft) let distanceConstraint = SCNDistanceConstraint(target: aircraft) distanceConstraint.minimumDistance = 10 // set to whatever minimum distance between the camera and aircraft you'd like distanceConstraint.maximumDistance = 10 // set to whatever maximum distance between the camera and aircraft you'd like camera.constraints = [lookAtConstraint, distanceConstraint] 

对于iOS 10及更早版本,您可以使用SCNTransformConstraint实现距离约束。 这是一个基本的(虽然稍微难看)的实现,它使用线性插值来更新节点的位置。

 func normalize(_ value: Float, in range: ClosedRange<Float>) -> Float { return (value - range.lowerBound) / (range.upperBound - range.lowerBound) } func interpolate(from start: Float, to end: Float, alpha: Float) -> Float { return (1 - alpha) * start + alpha * end } let target = airplane let minimumDistance: Float = 10 let maximumDistance: Float = 15 let distanceConstraint = SCNTransformConstraint(inWorldSpace: false) { (node, transform) -> SCNMatrix4 in let distance = abs(sqrt(pow(target.position.x - node.position.x, 2) + pow(target.position.y - node.position.y, 2) + pow(target.position.z - node.position.z, 2))) let normalizedDistance: Float switch distance { case ...minimumDistance: normalizedDistance = self.normalize(minimumDistance, in: 0 ... distance) case maximumDistance...: normalizedDistance = self.normalize(maximumDistance, in: 0 ... distance) default: return transform } node.position.x = self.interpolate(from: target.position.x, to: node.position.x, alpha: normalizedDistance) node.position.y = self.interpolate(from: target.position.y, to: node.position.y, alpha: normalizedDistance) node.position.z = self.interpolate(from: target.position.z, to: node.position.z, alpha: normalizedDistance) return transform } 

第二种行为可以通过确定您的飞机的边界框和相机的本地坐标空间中的所有path段,然后更新相机与该边界框中心的距离来构build视口中的所有这些节点。 frameNodes(_:)是一种实现这种function的便捷方法,在iOS 11中引入,并在SCNCameraController上定义。 如果可能,我build议使用它,除非你想自己潜入三angular。 您可以使用您的场景视图的默认相机控制器或创build一个临时实例,以适合您的应用程序的需求。