【问题标题】:Moving an SCNNode relative to the root node相对于根节点移动 SCNNode
【发布时间】:2015-02-19 13:41:49
【问题描述】:

我正在通过编写一个游戏来学习 SceneKit,在这个游戏中你正在飞越小行星场以躲避物体。最初,我通过移动/旋转相机来做到这一点,但我意识到在某些时候我会用完坐标空间,最好将所有对象移向相机(并在我“通过”他们)。

但我似乎无法让他们移动。我移动相机的原始代码如下所示:

[cameraNode setTransform:CATransform3DTranslate(cameraNode.transform, 0.f, 0.f, -2.f)];

我认为我可以对每个小行星节点做类似的事情:

[asteroidNode setTransform:CATransform3DTranslate(cameraNode.transform, 0.f, 0.f, 2.f)];

但他们不动。如果我添加一个基本动画:

CABasicAnimation *anim = [CABasicAnimation animationWithKeyPath:@"position.z"];
anim.byValue = @10;
anim.duration = 1.0;
[asteroidNode addAnimation:anim forKey:@"move forward"];

小行星会移动,但可以预见的是,完成后会迅速回到原来的位置。

这感觉像是一个新手错误,但我在网上找不到任何解决此问题的方法。我是不是走错路了?

谢谢, 杰夫

【问题讨论】:

    标签: scenekit


    【解决方案1】:

    按照您的方式移动 cameraNode 应该可以,但请确保“cameraNode”是您当前的 pointOfView,否则它将不起作用(检查 scnView.pointOfView == cameraNode)。

    如果你想移动节点,你应该翻译“node.transform”(而不是“cameraNode.transform”)。但实际上这样做更简单:

    node.position = SCNVector3Make(node.position.x, node.position.y, node.position.z+2.0);

    还要确保这些节点上没有运行可能覆盖您的更改的动画或物理。

    【讨论】:

    • 谢谢您,东洋公司! “cameraNode.transform”只是这篇文章中的一个复制和粘贴错误,但小行星正在旋转,看起来这会破坏转换。当我禁用旋转时,一切都按预期工作。现在只需要根据船是否在移动来让旋转和平移协同工作,我希望能弄清楚...并且感谢您提供关于简化代码的提示!
    • 我不知道 pointOfView 属性存在,非常感谢。
    猜你喜欢
    • 2018-03-02
    • 1970-01-01
    • 2019-11-06
    • 1970-01-01
    • 2018-08-04
    • 1970-01-01
    • 2021-07-12
    • 2014-08-20
    • 1970-01-01
    相关资源
    最近更新 更多