我使用 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) 有一段时间我四处寻找我的问题的答案,但找不到任何真正有帮助的东西,或解释正在发生的事情。我也一遍又一遍地检查了我在 SO 上找到的所有内容,但找不到答案。
在 AR 世界中显示对象时,此问题不断发生。iEx 我将一个物体放置在地板上的一个平面上,这是我的隐形阴影平面。那么这完全取决于设备的视角。为了澄清,我添加了图像,它的视角略有不同。看看阴影发生了什么:
我希望一直有一个好的影子,而不是像你看到的那样的人工制品。
注意:我已经使用了shadowSampleCount、 Bias 和所有其他选项,这应该有助于获得适当的、低渲染成本的阴影。
以下是Lighting and Plane、Material等相关代码的摘录
对于SCNLight:
class func directionalLight() -> SCNLight {
let light = SCNLight()
light.type = .directional
light.castsShadow = true
light.color = UIColor.white
light.shadowMode = .deferred
light.shadowSampleCount = 8
light.shadowRadius = 1
// light.automaticallyAdjustsShadowProjection = false
light.shadowColor = UIColor(red: 0, green: 0, blue: 0, alpha: 0.75)
light.categoryBitMask = -1
return light
}
Run Code Online (Sandbox Code Playgroud)
以及我如何添加它:
func setupLights() {
lightDirectionNode.light = Lighting.directionalLight()
// lightDirectionNode.eulerAngles = SCNVector3(-66.degreesToRadians, 0, 0) …Run Code Online (Sandbox Code Playgroud) 我正在开发一个应用程序,它应该在天空盒内渲染镀铬风格的反射球状物体(使用六面立方体贴图)。
我正在 Swift 中使用 Scenekit 以不同的方法执行此操作。
只要我让 Scenekit 完成所有工作,一切都很好并且完美反映(参见下图 1) - 换句话说,使用金属度 1.0、粗糙度 0.0 和颜色 UIColor.white 的标准 SCNMaterial(使用 .physicallyBased 作为照明模型)附加到节点几何体的第一个材质(包括定向光)。
但目标是使用 SCNProgram (附加到节点的材质)及其自己的顶点和片段着色器 - 对应于 Apple 的相关文档。我有一个工作场景,但对象上的反射是错误的(如下面的图 2 所示)
主要问题是:要使用scn_node或scn_frame (在shaders.metal 文件中)中的正确矩阵值,以获得与图 1 中的 Scenekit 相同的对象反射。但是将 SCNProgram 与着色器一起使用仅(并且没有光)。不幸的是,Apple 没有提供有关 SCNProgram 提交给着色器的不同矩阵以及使用哪个矩阵的大量信息 - 或示例。
这是我当前的顶点着色器,其中我假设使用了一些错误的矩阵(我留下了一些注释掉的代码,以显示已经测试过的内容,未注释掉的代码对应于图 2 的 1:1):
vertex SimpleVertexChromeOrig myVertexChromeOrig(MyVertexInput in [[ stage_in ]],
constant SCNSceneBuffer& scn_frame [[buffer(0)]],
constant MyNodeBuffer& scn_node [[buffer(1)]])
{
SimpleVertexChromeOrig OUT;
OUT.position = scn_node.modelViewProjectionTransform * float4(in.position, 1.0);
// …Run Code Online (Sandbox Code Playgroud) scenekit ×3
arkit ×2
swift ×2
metal ×1
reflection ×1
scncamera ×1
scnprogram ×1
shader ×1
shadow ×1