viewDidLoad期间应用的SceneKit节点旋转没有效果



我有一个SceneKit场景,该场景包括.dae文件(从Blender导出(中的参考节点以及直接在场景编辑器中添加的各种相机和灯光。为了使引用节点以正确的方向显示在编辑器中,它应用了一个旋转(-90,0,0(。这不会转移到应用内视图,所以我已经成功地在viewDidLoad()调用的函数中应用了旋转。

自从今天的重构以来,没有发生任何轮换。代码仍然试图以同样的方式应用更正——这只是一次整理。

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

  • 将旋转应用为持续时间为零的SCNAction.rotateTo(),而不是node.eulerAngles =
  • 安排稍后应用的旋转(Timer.scheduledTimer(...)(

这两个都表明存在时间问题,我没有进行预重构。SceneKit节点旋转是否仅在节点至少渲染过一次时才生效?当然,在幕后也有一些优化,因为即使延迟分配给node.eulerAngles,也只会在值发生变化时对渲染内容产生影响。

编辑:

仔细比较前后版本的代码,可以发现一个看似不重要的排序变化。在原作中,我添加了一些生成的节点(SCNNode的一个子类,平面使用SKScene作为其纹理(,然后旋转参考节点(有效(。重新考虑后,这一顺序发生了逆转。节点是兄弟节点,而不是子节点,所以我不明白为什么这很重要,除非SKScene因为纹理减慢了速度,足以避免一些优化?

生成示例游戏代码,并在viewDidLoad中应用旋转对repeatForever和rotateBy调用都有效,但示例代码确实没有多大作用。由于渲染循环实际上是在自己的线程中处理的,所以不确定这是否证明了什么。在没有看到代码或渲染循环中发生了多少事情的情况下,很可能旋转命令并不总是被处理,因为它们没有被注入到渲染队列线程中。

另一种选择是,将模型旋转到搅拌机中所需的位置,然后为Scenekit设置Y-Up。我不太擅长Blender,所以我保存了一些关于如何在Blender中旋转、保存和导出的文档-如果你需要,我可以发布它。然后用这个命令行处理Y-Up的模型。

/Applications/Xcode.app/Contents/Developer/usr/bin/scntool--转换fighter0.dae--格式c3d--输出.dae--强制-强制交错--查找pvrtc图像

不知道你有多远,但我与之斗争了很长一段时间,发现如果我的搅拌机型号从一开始就设置为正确的旋转,并且也能在XCode中正确预览,它对我来说效果更好。在某个时候,你可能正在进行一些旋转或SCNLookat,而我的模型总是关闭。可能有一种更简单的方法来纠正它们,但既然可以从一开始就设置为你想要的状态,为什么还要进行额外的计算呢。

希望能有所帮助。

最新更新