首页 文章

在 SceneKit 中,如何让相机观察节点几何体的特定面?

提问于
浏览
1

在 SceneKit 中,您可以向 SceneView 的 Point Of View 添加 lookAtConstraint 约束,以使 Camera 查看某个节点。

有没有一种标准的方法可以做同样的事情但是对于几何体的特定面?

这样,如果我触摸立方体的特定面,相机会移动,使相机节点的 Z 轴与触摸面的法线成一致?这样,立方体看起来就像是一个新的视角。

2 回答

  • 2

    没有。

    除了 re-aiming 之外,还需要移动相机。

    想象一下,我在我家门口。我对前方有很好的看法,几乎看不到我左边的那边。在我的场景中,我点击房子的一侧。 LookAt 约束只会改变相机的角度。它不会与那个几乎看不见的一侧的法线对齐。

    为了与正常情况保持一致,我必须在房子里走来走去,直到我能盯着房子并垂直于我拍摄的那一面。在什么半径?什么路?你必须自己解决这个问题。

    根据您尝试的效果,您可能希望旋转模型而不是移动相机。在本地旋转抽头节点(或作为不可见父节点的子节点),使其 minus-Z 轴指出抽头面,并在节点上保持 lookAtConstraint,而不是摄像机。但是,这种方法会改变对象的外观:你会看到它旋转,阴影会发生相应的变化。

  • 1

    这样,如果我触摸立方体的特定面,相机会移动,使相机节点的 Z 轴与触摸面的法线成一致?

    假设您正在使用 hit-testing 来确定触摸了什么对象,SCNHitTestResult将为您提供localCoordinateslocalNormal,从中可以很容易地推导出相机变换。

    一种简单的方法是将相机作为盒子的子节点,计算一个看起来像localCoordinates + distance * localNormal的位置,最后使用GLKMatrix4MakeLookAtSCNMatrix4FromGLKMatrix4进行变换。

    请注意,您还可以使用worldCoordinatesworldNormal以及转换实用程序(如SCNNode.convertTransform(_:from:))。

相关问题