【问题标题】:In SceneKit, how do you make camera look at a specific face of a node's geometry?在 SceneKit 中,如何让相机查看节点几何体的特定面?
【发布时间】:2017-04-21 02:57:47
【问题描述】:

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

除了几何体的特定面外,是否有一种标准方法可以做到这一点?

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

【问题讨论】:

    标签: scenekit


    【解决方案1】:

    没有。

    除了重新瞄准之外,这还需要移动相机。

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

    为了与法线保持一致,我必须在房子周围走动,直到我可以盯着房子并垂直于我敲击的那一侧。在什么半径范围内?什么路径?你必须自己弄清楚。

    根据您要尝试的效果,您可能希望旋转模型而不是移动相机。局部旋转被敲击的节点(或作为不可见父节点的子节点),使其负 Z 轴指向被敲击的面,并在 节点 上而不是相机上保持 lookAtConstraint。但是,这种方法会改变对象的外观:您会看到它在旋转,并且阴影会相应地发生变化。

    【讨论】:

    • 谢谢哈尔,有道理。
    【解决方案2】:

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

    假设您正在使用命中测试来确定被触摸的对象,SCNHitTestResult 将为您提供 localCoordinateslocalNormal,从中可以很容易地推导出相机变换。

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

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

    【讨论】:

      【解决方案3】:

      改变 mnuages 答案,使用命中测试或光线追踪来查找用户在网格上点击的位置,然后在该位置添加一个节点,并约束相机查看该节点。

      【讨论】:

        猜你喜欢
        • 2019-10-25
        • 2021-08-14
        • 2017-09-12
        • 1970-01-01
        • 2016-11-25
        • 1970-01-01
        • 1970-01-01
        • 2019-05-16
        • 2021-12-16
        相关资源
        最近更新 更多