scenekit - 在 viewDidLoad 期间应用的 SceneKit 节点旋转无效
问题描述
我有一个 SceneKit 场景,其中包含来自.dae
文件(从 Blender 导出)的参考节点以及直接在场景编辑器中添加的各种相机和灯光。为了使参考节点在编辑器中以正确的方向显示,它应用了旋转 (-90, 0, 0)。这不会延续到应用内视图,所以我已经成功地在一个名为 from 的函数中应用了旋转viewDidLoad()
。
由于今天进行了重构,因此没有发生轮换。代码仍然尝试以相同的方式应用更正 - 这只是一个整理。
各种黑客确实成功地旋转了节点:
- 将旋转应用为
SCNAction.rotateTo()
持续时间为零的,而不是node.eulerAngles =
- 安排稍后应用旋转 (
Timer.scheduledTimer(...)
)
这两者都表明存在时间问题,即我没有达到的预重构。SceneKit 节点旋转是否仅在节点至少被渲染一次时才生效?在幕后肯定有一些优化,因为即使是延迟分配也node.eulerAngles
只会在导致值发生变化时对渲染的内容产生影响。
编辑:
仔细比较之前和之后的代码版本,发现了一个看似不重要的顺序变化。在原始版本中,在旋转参考节点(有效)之前,我添加了一些生成的节点(一个平面的子类,SCNNode
使用SKScene
它的纹理)。重构后,该顺序已颠倒。节点是兄弟姐妹,而不是后代,所以我不明白为什么这很重要,除非 SKScene-as-texture 将事情放慢到足以避免一些优化?
解决方案
生成示例游戏代码并在 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-图像
不知道你有多长,但我与这个斗争了很长时间,发现如果我的搅拌机模型从一开始就设置为正确的旋转并且在 XCode 中也能正确预览,它对我来说效果更好。在某些时候,您可能正在做一些旋转或 SCNLookat,而我的模型总是关闭。可能有一种更简单的方法来纠正它们,但是当它可以从一开始就设置为您想要的状态时,为什么还要进行额外的数学运算。
希望有帮助。
推荐阅读
- reactjs - 调用 props.generateRandomQuote() 返回 undefined
- excel - 通过 VBA 设置默认打印机
- c# - 将控制器 ASP.NET 中的 JSON 哈希集反序列化为哈希集或字典
- apache-kafka-streams - 2.3.1版本删除空目录失败
- javascript - 如果等于当前 URL,则 Jquery 添加 Active 类
- java - 有没有更好的方法让我的计算机对手生成(3>随机长度<=7)的单词?
- azure - 从 Azure 部署中排除 Azure Function 中的文件
- java - 可缓存如何通过使用其名称来获取方法参数值
- php - Wordpress PHP.INI 噩梦
- c# - 覆盖泛型基类型的方法