用两个手势在 iOS 中构建 3D 立方体
Building a 3D cube in iOS with two gestures
我可以使用下面的代码在 iOS 中自动创建一个 3D 立方体。
问题是:如何用两个手势构建一个3D立方体?
使用捏合手势我想在 XZ 轴上构建一个立方体底座。
然后用拖动手势我想在 Y 轴上构建一个立方体的高度。
怎么做?
import UIKit
import SceneKit
class GameViewController: UIViewController {
var scnView: SCNView!
var scnScene: SCNScene!
var cameraNode: SCNNode!
override func viewDidLoad() {
super.viewDidLoad()
setupView()
setupScene()
setupCamera()
spawnShape()
}
override func shouldAutorotate() -> Bool {
return true
}
override func prefersStatusBarHidden() -> Bool {
return true
}
func setupView() {
scnView = self.view as! SCNView
scnView.allowsCameraControl = true
scnView.autoenablesDefaultLighting = true
}
func setupScene() {
scnScene = SCNScene()
scnView.scene = scnScene
scnScene.background.contents = "BG.scnassets/BgTexture.png"
}
func setupCamera() {
cameraNode = SCNNode()
cameraNode.camera = SCNCamera()
cameraNode.position = SCNVector3(x: 0, y: 0, z: 12)
scnScene.rootNode.addChildNode(cameraNode)
}
func spawnShape() {
var geometry: SCNGeometry
switch ShapeType.random() {
case .Box:
geometry = SCNBox(width: 1.0, height: 1.0, length: 1.0, chamferRadius: 0.1)
}
let geometryNode = SCNNode(geometry: geometry)
scnScene.rootNode.addChildNode(geometryNode)
}
}
我尝试实现 UIPinchGestureRecognizer()
和 UIPanGestureRecognizer()
子类,但我失败了。我不知道怎么做。
var pinchGesture = UIPinchGestureRecognizer()
var dragGesture = UIPanGestureRecognizer()
override func viewDidLoad() {
super.viewDidLoad()
setupView()
setupScene()
setupCamera()
spawnShape()
self.scnView.userInteractionEnabled = true
self.scnView.multipleTouchEnabled = true
self.pinchGesture = UIPinchGestureRecognizer(target: self, action: #selector(pinchRecognized(_:)))
self.dragGesture = UIPanGestureRecognizer(target: self, action: #selector(panRecognized(_:)))
self.scnView.addGestureRecognizer(self.pinchGesture)
self.scnView.addGestureRecognizer(self.dragGesture)
}
@IBAction func pinchRecognized(pinch: UIPinchGestureRecognizer) {
........
}
@IBAction func panRecognized(pan: UIPanGestureRecognizer) {
........
}
您可以使用 UIGestureRecognizers
来完成您要查找的内容。
在您的 ViewDidLoad()
中添加您的识别器:
// Add Gesture recognizers
let pinch = UIPinchGestureRecognizer(target: self, action: #selector(scaleSizeOfGeometry(sender:)))
scnView.addGestureRecognizer(pinch)
XZ 方向的增量缩放现在可以通过以下方式完成:
func scaleSizeOfGeometry(sender: UIPinchGestureRecognizer) {
let scale = Float(sender.scale)
referenceToGeometry?.scale.x *= scale
referenceToGeometry?.scale.z *= scale
sender.scale = 1.0
}
您必须引用要以某种方式缩放的几何图形。例如,在 spawnGeometry()
:
中设置的变量 referenceToGeometry : SCNNode?
referenceToGeometry = geometryNode
UIPanGestureRecognizer
有点棘手,因为您可以使用速度或平移在 Y 方向缩放。在您的 viewDidLoad()
中添加手势识别器:
let pan = UIPanGestureRecognizer(target: self, action: #selector(scaleHeightOfGeometry(sender:)))
scnView.addGestureRecognizer(pan)
并在您的函数中使用速度或平移:
func scaleHeightOfGeometry(sender: UIPanGestureRecognizer) {
// y : sender.translation(in: self.scnView).y
// v : sender.velocity(in: self.scnView).y
}
您必须根据自己的喜好从其中任何一个中提取乘数。例如,通过存储 y[i-1] 并检查两者之间的差异,而不是将差异添加到几何高度并将 newValue 存储为第 y[i-1] 个值。
编辑:
要添加到 post,您可以使用 UIGestureRecognizer
状态以获得更多 advanced/finetuned 版本。
我可以使用下面的代码在 iOS 中自动创建一个 3D 立方体。
问题是:如何用两个手势构建一个3D立方体?
使用捏合手势我想在 XZ 轴上构建一个立方体底座。
然后用拖动手势我想在 Y 轴上构建一个立方体的高度。
怎么做?
import UIKit
import SceneKit
class GameViewController: UIViewController {
var scnView: SCNView!
var scnScene: SCNScene!
var cameraNode: SCNNode!
override func viewDidLoad() {
super.viewDidLoad()
setupView()
setupScene()
setupCamera()
spawnShape()
}
override func shouldAutorotate() -> Bool {
return true
}
override func prefersStatusBarHidden() -> Bool {
return true
}
func setupView() {
scnView = self.view as! SCNView
scnView.allowsCameraControl = true
scnView.autoenablesDefaultLighting = true
}
func setupScene() {
scnScene = SCNScene()
scnView.scene = scnScene
scnScene.background.contents = "BG.scnassets/BgTexture.png"
}
func setupCamera() {
cameraNode = SCNNode()
cameraNode.camera = SCNCamera()
cameraNode.position = SCNVector3(x: 0, y: 0, z: 12)
scnScene.rootNode.addChildNode(cameraNode)
}
func spawnShape() {
var geometry: SCNGeometry
switch ShapeType.random() {
case .Box:
geometry = SCNBox(width: 1.0, height: 1.0, length: 1.0, chamferRadius: 0.1)
}
let geometryNode = SCNNode(geometry: geometry)
scnScene.rootNode.addChildNode(geometryNode)
}
}
我尝试实现 UIPinchGestureRecognizer()
和 UIPanGestureRecognizer()
子类,但我失败了。我不知道怎么做。
var pinchGesture = UIPinchGestureRecognizer()
var dragGesture = UIPanGestureRecognizer()
override func viewDidLoad() {
super.viewDidLoad()
setupView()
setupScene()
setupCamera()
spawnShape()
self.scnView.userInteractionEnabled = true
self.scnView.multipleTouchEnabled = true
self.pinchGesture = UIPinchGestureRecognizer(target: self, action: #selector(pinchRecognized(_:)))
self.dragGesture = UIPanGestureRecognizer(target: self, action: #selector(panRecognized(_:)))
self.scnView.addGestureRecognizer(self.pinchGesture)
self.scnView.addGestureRecognizer(self.dragGesture)
}
@IBAction func pinchRecognized(pinch: UIPinchGestureRecognizer) {
........
}
@IBAction func panRecognized(pan: UIPanGestureRecognizer) {
........
}
您可以使用 UIGestureRecognizers
来完成您要查找的内容。
在您的 ViewDidLoad()
中添加您的识别器:
// Add Gesture recognizers
let pinch = UIPinchGestureRecognizer(target: self, action: #selector(scaleSizeOfGeometry(sender:)))
scnView.addGestureRecognizer(pinch)
XZ 方向的增量缩放现在可以通过以下方式完成:
func scaleSizeOfGeometry(sender: UIPinchGestureRecognizer) {
let scale = Float(sender.scale)
referenceToGeometry?.scale.x *= scale
referenceToGeometry?.scale.z *= scale
sender.scale = 1.0
}
您必须引用要以某种方式缩放的几何图形。例如,在 spawnGeometry()
:
referenceToGeometry : SCNNode?
referenceToGeometry = geometryNode
UIPanGestureRecognizer
有点棘手,因为您可以使用速度或平移在 Y 方向缩放。在您的 viewDidLoad()
中添加手势识别器:
let pan = UIPanGestureRecognizer(target: self, action: #selector(scaleHeightOfGeometry(sender:)))
scnView.addGestureRecognizer(pan)
并在您的函数中使用速度或平移:
func scaleHeightOfGeometry(sender: UIPanGestureRecognizer) {
// y : sender.translation(in: self.scnView).y
// v : sender.velocity(in: self.scnView).y
}
您必须根据自己的喜好从其中任何一个中提取乘数。例如,通过存储 y[i-1] 并检查两者之间的差异,而不是将差异添加到几何高度并将 newValue 存储为第 y[i-1] 个值。
编辑:
要添加到 post,您可以使用 UIGestureRecognizer
状态以获得更多 advanced/finetuned 版本。