在 SceneKit 中,您可以向 SceneView 的 Point Of View 添加 lookAtConstraint 约束,以使 Camera 查看某个节点。
有没有一种标准的方法可以做同样的事情但是对于几何体的特定面?
这样,如果我触摸立方体的特定面,相机会移动,使相机节点的 Z 轴与触摸面的法线成一致?这样,立方体看起来就像是一个新的视角。
没有。
除了 re-aiming 之外,还需要移动相机。
想象一下,我在我家门口。我对前方有很好的看法,几乎看不到我左边的那边。在我的场景中,我点击房子的一侧。 LookAt 约束只会改变相机的角度。它不会与那个几乎看不见的一侧的法线对齐。
为了与正常情况保持一致,我必须在房子里走来走去,直到我能盯着房子并垂直于我拍摄的那一面。在什么半径?什么路?你必须自己解决这个问题。
根据您尝试的效果,您可能希望旋转模型而不是移动相机。在本地旋转抽头节点(或作为不可见父节点的子节点),使其 minus-Z 轴指出抽头面,并在节点上保持 lookAtConstraint,而不是摄像机。但是,这种方法会改变对象的外观:你会看到它旋转,阴影会发生相应的变化。
这样,如果我触摸立方体的特定面,相机会移动,使相机节点的 Z 轴与触摸面的法线成一致?
假设您正在使用 hit-testing 来确定触摸了什么对象,SCNHitTestResult将为您提供localCoordinates和localNormal,从中可以很容易地推导出相机变换。
localCoordinates
localNormal
一种简单的方法是将相机作为盒子的子节点,计算一个看起来像localCoordinates + distance * localNormal的位置,最后使用GLKMatrix4MakeLookAt和SCNMatrix4FromGLKMatrix4进行变换。
localCoordinates + distance * localNormal
请注意,您还可以使用worldCoordinates,worldNormal以及转换实用程序(如SCNNode.convertTransform(_:from:))。
worldCoordinates
worldNormal
2 回答
没有。
除了 re-aiming 之外,还需要移动相机。
想象一下,我在我家门口。我对前方有很好的看法,几乎看不到我左边的那边。在我的场景中,我点击房子的一侧。 LookAt 约束只会改变相机的角度。它不会与那个几乎看不见的一侧的法线对齐。
为了与正常情况保持一致,我必须在房子里走来走去,直到我能盯着房子并垂直于我拍摄的那一面。在什么半径?什么路?你必须自己解决这个问题。
根据您尝试的效果,您可能希望旋转模型而不是移动相机。在本地旋转抽头节点(或作为不可见父节点的子节点),使其 minus-Z 轴指出抽头面,并在节点上保持 lookAtConstraint,而不是摄像机。但是,这种方法会改变对象的外观:你会看到它旋转,阴影会发生相应的变化。
假设您正在使用 hit-testing 来确定触摸了什么对象,SCNHitTestResult将为您提供
localCoordinates
和localNormal
,从中可以很容易地推导出相机变换。一种简单的方法是将相机作为盒子的子节点,计算一个看起来像
localCoordinates + distance * localNormal
的位置,最后使用GLKMatrix4MakeLookAt和SCNMatrix4FromGLKMatrix4进行变换。请注意,您还可以使用
worldCoordinates
,worldNormal
以及转换实用程序(如SCNNode.convertTransform(_:from:))。