在SceneKit中,您可以将LookAtConstraint约束添加到SceneView的视点,以使相机查看某个节点。
对于几何体的特定面,有没有一种标准的方法可以做同样的事情?
这样,如果我触摸立方体的特定面,相机会移动,使相机节点的Z轴与触摸面的法线一致?因此,立方体看起来就像是一个新的视角的平面。
答案 0 :(得分:2)
没有。
除了重新瞄准之外,还需要移动相机。
想象一下,我在我家门口。我对前方有很好的看法,几乎看不到我左边的那边。在我的场景中,我点击房子的一侧。 LookAt约束只会改变相机的角度。它不会与那个几乎看不见的一侧的法线对齐。
为了与正常情况保持一致,我必须在房子里走来走去,直到我能盯着房子,并垂直于我拍摄的那一面。在什么半径?什么路?你必须自己解决这个问题。
根据您尝试的效果,您可能希望旋转模型而不是移动相机。在本地旋转抽头节点(或作为不可见父节点的子节点),使其零-Z轴指出抽头面,并在节点而不是摄像机上保持lookAtConstraint。但是,这种方法会改变对象的外观:你会看到它旋转,阴影也会改变。
答案 1 :(得分:1)
这样,如果我触摸立方体的特定面,相机会移动,使相机节点的Z轴与触摸面的法线一致?
假设您正在使用命中测试来确定触摸的对象,SCNHitTestResult将为您提供localCoordinates
和localNormal
,从中可以非常轻松地获取相机变换
一种简单的方法是将相机作为盒子的子节点,计算一个看起来像localCoordinates + distance * localNormal
的位置,最后使用GLKMatrix4MakeLookAt
和SCNMatrix4FromGLKMatrix4
进行转换。< / p>
请注意,您还可以使用worldCoordinates
,worldNormal
以及转化实用程序,例如SCNNode.convertTransform(_:from:)。
答案 2 :(得分:0)
改变人体的答案,使用命中测试或光线跟踪来找出用户在网格上的点击位置,然后在该位置添加一个节点,并约束相机将其瞄准该节点。