将UIView和SCNNode“粘在一起”用于动画

时间:2015-04-20 18:00:25

标签: ios swift uiview nodes scenekit

背景

我想同步移动包含图像的SCNNode和UIView。带有UIImageView的UIView位于Node上,因此看起来它们是SCNNode(一个多维数据集)的纹理。

代码

let move:Float = 15
let moveCube: SCNAction = SCNAction.moveTo(SCNVector3Make(cube.position.x-move, cube.position.y, cube.position.z), duration: 1)

我尝试了什么/我现在怎么做

我使用以下方式为UIView设置动画:

var move:Float = 15
var projMove = scnView.projectPoint(SCNVector3(x: move, y: 0, z: 0)) //converts 3D coordSystem into 2D

UIView.animateWithDuration(1, delay: 0, options: nil | UIViewAnimationOptions.CurveEaseOut, animations: {
    self.myView.center.x = CGFloat(-projMove.x)
    }, completion: { finished in
})

这个工作,立方体向左移动,UIView也是如此。
但是这段代码并不是我认为最好的解决方案。

问题(S)

  1. 有没有更好的方法让立方体向左移动,包括UIView?
    • 同样,我想同时移动它,最好是一个代码段
  2. 我可以将一个表面(前面的例如)纹理设置为图像吗?
    • 我想将图片设置为只有一面的纹理
  3. 我是否可以将整体纹理设置为图像,然后使用它的alpha通道将图像置于其上方?
    • 加起来#2,我想将立方体的纹理设置为一种颜色, 那种颜色我要投影图像(它有alpha图层,所以颜色应该仍然是可见的。)
  4. 提前致谢:)

1 个答案:

答案 0 :(得分:1)

  

有没有更好的方法让立方体向左移动,包括UIView?

是。您可以取消投影视图的坐标,并将其用作多维数据集移动的参考。见Unproject Point

  

我可以将一个表面(前面例如)纹理设置为图像吗?

是的,只需将立方体材质的漫反射通道设置为UIImage。

  

我是否可以将整体纹理设置为图像,然后使用它的alpha通道将图像放在上面?

也许,我不太确定你在谈论什么,你会介意扩展吗?如果我理解一点Spritekit将是你最好的选择。

以下是评论的更新答案:

  

在将它们投影到SCNAction中之前,我确实使用了未投影的点。我的意思更像是同时移动两个而不是单独的动画。

我认为没有。您可以为第三方属性设置动画并更改其setter以更改视图和节点。您也可以使用块,但最终您无法直接链接这两个块。

  

好吧,我想将图像仅设置在立方体的一侧。

您可以简单地提供6种材质的阵列,一种是您的图像,另外五种是另一种材料。您需要使用顺序来查找图像在阵列中的位置。

  

这与#2有关,我想将纹理设置为一种颜色,然后将一面的纹理设置为我想要使用的图像。

这有两种方法。您可以使用将在纯色上添加图像的着色器,或者可以制作稍小(小于1%)的第二个立方体,并使该多维数据集成为所需的背景颜色。然后,在较大的图像上使用透明图像。