iOS上的3D旋转对象动画

时间:2014-01-29 23:22:10

标签: ios animation opengl-es 3d rotation

我想在iOS上复制此video的第6秒显示的3D旋转对象。我没有任何3D动画/游戏体验,所以我不知道从哪里开始。我看了一下,发现了Ray Wenderlich的this教程。我想我可以将形状从立方体改为矩形棱镜,并在旋转时将其移动,但我希望它在3D上有一些标识,文字等。这就是我被困住的地方。

与此类工作相关的任何建议或教程?

2 个答案:

答案 0 :(得分:0)

您需要首先熟悉3D编程的一般概念,因为您的问题含糊不清。你是什​​么意思?

该立方体由几个不同的数据阵列组成,这些数据定义了每个三角形面上每个顶点的不同属性。因此,如果您希望立方体中出现3D文本,则需要重新定义这些数组。

学习3D编程有大量资源,概念通常是普遍的。

答案 1 :(得分:-1)

这就是我为旋转立方体所做的。希望它有所帮助。

var cubeLayer = CATransformLayer()
var layer1 = CALayer()
var layer2 = CALayer()
var layer3 = CALayer()
var layer4 = CALayer()

var pt = CATransform3DIdentity
pt.m34 = -1.0 / 500.0
yourView.layer.sublayerTransform = pt

layer1.backgroundColor = UIColor.red.cgColor
layer1.frame = CGRect(x: 0, y: 0, width: 200, height: 200)
layer1.transform = CATransform3DTranslate(layer1.transform, 0, 0, 100)
cubeLayer.addSublayer(layer1)

layer2.backgroundColor = UIColor.green.cgColor
layer2.frame = CGRect(x: 0, y: 0, width: 200, height: 200)
layer2.transform = CATransform3DTranslate(layer2.transform, -100, 0, 0)
layer2.transform = CATransform3DRotate(layer2.transform, .pi / 2, 0, 1, 0)
cubeLayer.addSublayer(layer2)

layer3.backgroundColor = UIColor.yellow.cgColor
layer3.frame = CGRect(x: 0, y: 0, width: 200, height: 200)
layer3.transform = CATransform3DTranslate(layer3.transform, 100, 0, 0)
layer3.transform = CATransform3DRotate(layer3.transform, .pi / 2, 0, 1, 0)
cubeLayer.addSublayer(layer3)

layer4.backgroundColor = UIColor.blue.cgColor
layer4.frame = CGRect(x: 0, y: 0, width: 200, height: 200)
layer4.transform = CATransform3DTranslate(layer4.transform, 0, 0, -100)
cubeLayer.addSublayer(layer4)

cubeLayer.frame = CGRect(x: 0, y: 0, width: 200, height: 200)
yourView.layer.addSublayer(cubeLayer)

在您的视图中添加手势并使用交换手势旋转它,使用下面的代码可以从左到右旋转立方体。

let swiperight = UISwipeGestureRecognizer(target: self, action: #selector(self.swiperight))
swiperight.direction = .right
yourView.addGestureRecognizer(swiperight)

@objc func swiperight(_ gestureRecognizer: UISwipeGestureRecognizer) { 
    self.cubeLayer.transform = CATransform3DRotate(self.cubeLayer.transform, .pi / -1.5, 0, 1, 0)

    self.cubeLayer.transform = CATransform3DRotate(self.cubeLayer.transform, .pi / 4
        , 0, 1, 0)

    self.cubeLayer.transform = CATransform3DRotate(self.cubeLayer.transform, .pi / 2
        , 0, 1, 0)
}