小编ZAY*_*ZAY的帖子

ARKit – 如何显示来自放置在 SCNPlane 上的虚拟 SCNCamera 的源?

我使用 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)

augmented-reality scenekit swift scncamera arkit

6
推荐指数
2
解决办法
2116
查看次数

SceneKit / ARKit 中不可见阴影平面的问题

有一段时间我四处寻找我的问题的答案,但找不到任何真正有帮助的东西,或解释正在发生的事情。我也一遍又一遍地检查了我在 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)

shadow augmented-reality scenekit swift arkit

5
推荐指数
1
解决办法
976
查看次数

哪些是在 SCNProgram 传递的金属着色器中使用的正确矩阵值,以获得正确的镀铬反射

我正在开发一个应用程序,它应该在天空盒内渲染镀铬风格的反射球状物体(使用六面立方体贴图)。

我正在 Swift 中使用 Scenekit 以不同的方法执行此操作。

只要我让 Scenekit 完成所有工作,一切都很好并且完美反映(参见下图 1) - 换句话说,使用金属度 1.0、粗糙度 0.0 和颜色 UIColor.white 的标准 SCNMaterial(使用 .physicallyBased 作为照明模型)附加到节点几何体的第一个材质(包括定向光)。

图1-正确的反射

但目标是使用 SCNProgram 附加到节点的材质)及其自己的顶点和片段着色器 - 对应于 Apple 的相关文档。我有一个工作场景,但对象上的反射是错误的(如下面的图 2 所示)

图2-错误的反映

主要问题是:要使用scn_nodescn_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)

reflection shader scenekit metal scnprogram

5
推荐指数
1
解决办法
1259
查看次数