我使用 ARKit 和 SceneKit 将一些对象放入 AR 空间中。效果很好。现在我想添加一个额外的摄像机 (SCNCamera),该摄像机放置在场景中的其他位置,由公共 SCNNode 连接和定位。它旨在从另一个(固定)角度向我展示当前场景。
现在我想在 i.Ex 上展示这个额外的 SCNCamera feed。SCNPlane(作为漫反射第一种材质)- 就像电视屏幕一样。当然,我知道它只会显示位于相机焦点中的 SceneKit 内容,而不显示 ARKit 图像的其余部分(当然这只能由主相机实现)。那么简单的彩色背景就可以了。
我看过描述如何在 ARSpace 中的虚拟显示器上播放视频文件的教程,但我需要来自我自己当前场景的实时摄像机反馈。
我定义了这个对象:
let camera = SCNCamera()
let cameraNode = SCNNode()
Run Code Online (Sandbox Code Playgroud)
然后在 viewDidLoad 中我这样做:
camera.usesOrthographicProjection = true
camera.orthographicScale = 9
camera.zNear = 0
camera.zFar = 100
cameraNode.camera = camera
sceneView.scene.rootNode.addChildNode(cameraNode)
Run Code Online (Sandbox Code Playgroud)
然后我调用我的设置函数,将虚拟显示器放置在所有 AR 东西旁边,同时定位相机节点(指向对象在场景中停留的方向)
cameraNode.position = SCNVector3(initialStartPosition.x, initialStartPosition.y + 0.5, initialStartPosition.z)
let cameraPlane = SCNNode(geometry: SCNPlane(width: 0.5, height: 0.3))
cameraPlane.geometry?.firstMaterial?.diffuse.contents = cameraNode.camera
cameraPlane.position = SCNVector3(initialStartPosition.x - 1.0, initialStartPosition.y + 0.5, …Run Code Online (Sandbox Code Playgroud) 下面的代码旨在模拟SceneKit中的默认相机控件,尤其是缩放和旋转功能。
但是,该代码不像默认控件那样流畅和通用。
例如,如果您加载了这两个模型,则默认缩放对这两个模型均一致。下面的代码仅适用于模型1,但对于模型2的缩放速度过快。
任何帮助,将不胜感激。
模式1:https://poly.google.com/view/6mRHqTCZHxw
模式2:https://poly.google.com/view/cKryD9VnDEZ
// Create camera
let camera = SCNCamera()
camera.automaticallyAdjustsZRange = true
camera.xFov = 30
camera.yFov = 0
// Compute distance to place camera
let theta = GLKMathDegreesToRadians(Float(camera.xFov/2))
let adjacentLength = oppositeLength / Float(tan(theta))
// Add camera to <cameraNode>
cameraNode.camera = camera
cameraNode.position = SCNVector3(x: 0, y: 0, z: adjacentLength)
// Add <cameraNode> to <orbitNode>
orbitNode.addChildNode(cameraNode)
// Add <orbitNode>
scene.rootNode.addChildNode(orbitNode)
// Handle pinches
let pinchRecognizer = UIPinchGestureRecognizer(target: self, action: #selector(didSceneViewPinch)) …Run Code Online (Sandbox Code Playgroud) 如何设置 2d 视图的 SceneKit SCNCamera属性,例如:
- top view
- bottom view
- front view
- back view
- left side view
- right side view
Run Code Online (Sandbox Code Playgroud) 我试图找出ipad和iphone上场景工具包中视野的正确值.默认值60 degree对屏幕边缘的球体有不良影响.球体呈椭圆形.值34 degree使得天空盒变得像素化.iPad和iPhone的正确值是多少?
_cameraNode = [SCNNode node];
_cameraNode.position = SCNVector3Make(0, 0, 500);
[scene.rootNode addChildNode:_cameraNode];
_cameraNode.camera = [SCNCamera camera];
_cameraNode.camera.automaticallyAdjustsZRange = YES;
#if TARGET_OS_IPHONE
if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) {
_cameraNode.camera.yFov = 55;
} else #endif {
_cameraNode.camera.xFov = 34;
}
scnView.pointOfView = _cameraNode;
Run Code Online (Sandbox Code Playgroud) 我有一个 SCNCamera 在 iOS 上的 3D SceneKit 视图中工作。
当我更改屏幕方向时,为了保持世界对象的大小和相对位置相同,我需要更改 SCNCamera 的 FoV。
但是,我无法为这种变化设置动画,因此当 FoV 从一种设置更改为另一种设置时,世界会“闪烁”或“脉冲”。
有没有一种方法可以顺利地做到这一点,以便视场的变化不会太突然而导致世界上的物体“脉动”?
当设备改变方向时,将执行以下代码:
if UIDevice.current.orientation == .landscapeLeft || UIDevice.current.orientation == .landscapeRight
{
self.cameraNode?.camera?.fieldOfView = 38
}
else
{
self.cameraNode?.camera?.fieldOfView = 50
}
Run Code Online (Sandbox Code Playgroud)
我尝试将 FoV 更改包装在 UIView 动画块中,但这不起作用。
我尝试在线程上运行它,但会有延迟,但这仍然会导致视场变化时的视觉“脉冲”。
有什么办法可以让这个过渡顺利吗?