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

时间:2016-12-06 12:53:08

标签: scenekit

在SceneKit中,您可以将LookAtConstraint约束添加到SceneView的视点,以使相机查看某个节点。

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

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

3 个答案:

答案 0 :(得分:2)

没有。

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

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

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

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

答案 1 :(得分:1)

  

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

假设您正在使用命中测试来确定触摸的对象,SCNHitTestResult将为您提供localCoordinateslocalNormal,从中可以非常轻松地获取相机变换

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

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

答案 2 :(得分:0)

改变人体的答案,使用命中测试或光线跟踪来找出用户在网格上的点击位置,然后在该位置添加一个节点,并约束相机将其瞄准该节点。