在viewDidLoad期间应用的SceneKit节点旋转无效

时间:2018-10-31 12:49:03

标签: scenekit

我有一个SceneKit场景,包括一个th { overflow: visible; } 文件(从Blender导出)中的参考节点,以及直接在“场景编辑器”中添加的各种相机和灯光。为了使参考节点在编辑器中以正确的方向出现,对其应用了旋转(-90、0、0)。这不会延续到应用内视图,因此我已经成功地在从.dae调用的函数中应用了旋转。

自从今天进行重构以来,没有轮换发生。该代码仍然尝试以相同的方式应用校正-这只是一个整洁的过程。

各种黑客确实成功旋转了节点:

  • 将轮换应用为持续时间为零而不是viewDidLoad()的{​​{1}}
  • 安排轮换在以后的时间(SCNAction.rotateTo()

这两个提示都存在时间问题,我没有遇到过重构问题。仅在至少渲染一次节点后,SceneKit节点旋转才会生效吗?幕后肯定存在一些优化,因为即使延迟分配给node.eulerAngles =,也只会影响导致值更改的呈现内容。

编辑:

仔细比较前后版本的代码,发现顺序上似乎无关紧要的更改。在原始文件中,我添加了一些生成的节点(Timer.scheduledTimer(...)的子类,其平面使用node.eulerAngles作为纹理)在旋转参考节点之前有效(有效) 。重新分配后,该顺序已颠倒。节点是兄弟姐妹,而不是子孙,所以我不明白为什么这很重要,除非将“ SKScene-as-Texture”放慢速度以至于避免一些优化?

1 个答案:

答案 0 :(得分:1)

生成了示例游戏代码,并在viewDidLoad中应用了旋转功能,这对repeatForever和RotateBy调用均有效,但是示例代码实际上并没有做很多事情。由于渲染循环实际上是在其自己的线程中处理的,因此不确定是否能证明任何事情。在没有看到代码或渲染循环中发生了多少的情况下,很有可能由于未将旋转命令注入渲染队列线程中,因此始终无法对其进行处理。

或者,将模型旋转到搅拌机中的所需位置,然后为Scenekit设置Y-Up。我对Blender不太满意,因此我保存了一些有关如何在Blender中旋转,保存和导出的文档-如果需要,可以将其发布。然后使用此命令行为Y-Up处理模型。

/Applications/Xcode.app/Contents/Developer/usr/bin/scntool --convert fighter0.dae --format c3d --output out.dae --force-y-up --force-interleaved --look -for-pvrtc-image

不确定您的距离有多远,但是我为此进行了很长时间的战斗,发现如果将我的搅拌器模型从一开始就设置为正确的旋转角度并且对XCode进行正确预览,它对我来说就会更好。在某些时候,您可能正在做一些旋转或SCNLookat,而我的模型始终处于关闭状态。可能有一种更简单的方法来更正它们,但是为什么可以一开始就将额外的数学设置为您想要的状态呢?

希望有帮助。