제스쳐를 인식하여 오브젝트에 적용하는 코드조각
제스쳐 recognizer
func addGestureRecognizers() {
let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(handleTap(gesture:)))
tapGestureRecognizer.delegate = self
sceneView.addGestureRecognizer(tapGestureRecognizer)
let panGestureRecognizer = UIPanGestureRecognizer(target: self, action: #selector(handlePan(_:)))
sceneView.addGestureRecognizer(panGestureRecognizer)
let pinchGestureRecognizer = UIPinchGestureRecognizer(target: self, action: #selector(handlePinch(_:)))
sceneView.addGestureRecognizer(pinchGestureRecognizer)
let longPressGestureRecognizer = UILongPressGestureRecognizer(target: self, action: #selector(handleLongPress(_:)))
longPressGestureRecognizer.minimumPressDuration = 2
longPressGestureRecognizer.delaysTouchesBegan = true
sceneView.addGestureRecognizer(longPressGestureRecognizer)
}
제스쳐 함수 (오브젝트를 이동)
@objc func handlePan(_ gesture: UIPanGestureRecognizer) {
let location = gesture.location(in: sceneView)
switch gesture.state {
case .began:
let hitResults = sceneView.hitTest(location, options: nil)
if let hitResult = hitResults.first {
selectedNode = hitResult.node
while let parent = selectedNode?.parent, parent !== sceneView.scene.rootNode {
selectedNode = parent
}
originalNodePosition = selectedNode ? .position
}
case.changed: if
let selectedNode = selectedNode,
let originalNodePosition = originalNodePosition {
let translation = gesture.translation(in: sceneView)
let newPosition = SCNVector3(
x: originalNodePosition.x + Float(translation.x * 0.05), y: originalNodePosition.y + Float(translation.y * -0.05), z: originalNodePosition.z + Float(translation.y * -0.05)
)
selectedNode.position = newPosition
}
case .ended, .cancelled:
selectedNode = nil
originalNodePosition = nil
default:
break
}
}
제스쳐 함수 (오브젝트 스케일링)
@objc func handlePinch(_ gesture: UIPinchGestureRecognizer) {
let location = gesture.location(in: (gesture.view as! ARSCNView))
switch gesture.state {
case .began:
let hitTest = (gesture.view as! ARSCNView).hitTest(location)
if let hitTest = hitTest.first {
selectedNode = hitTest.node
while let parent = selectedNode?.parent, parent !== sceneView.scene.rootNode {
selectedNode = parent
}
originalNodePosition = selectedNode?.position
}
case .changed:
if let selectedNode = selectedNode, let originalScale = originalScale {
let scale = Float(gesture.scale)
selectedNode.scale = SCNVector3(x: originalScale.x * scale, y: originalScale.y * scale, z: originalScale.z * scale)
}
case .ended, .cancelled:
if let selectedNode = selectedNode
{
originalScale = selectedNode.scale
}
default:
break
}
}
제스쳐 함수 (오브젝트 hidden)
@objc func handleTap(gesture: UITapGestureRecognizer) {
let location = gesture.location(in: sceneView)
let hitResults = sceneView.hitTest(location, options: nil)
if let hitResult = hitResults.first {
selectedNode = hitResult.node
while let parent = selectedNode?.parent, parent !== sceneView.scene.rootNode {
selectedNode = parent
}
originalNodePosition = selectedNode?.position
originalScale = selectedNode?.scale
if let selectedNode = selectedNode {
for i in 1...64 {
let nodeName = String(format: "Feu%02d", i)
if let fireNode = selectedNode.childNode(withName: nodeName, recursively: true) {
if fireNode.isHidden {
fireNode.isHidden = false
playSound(currentModelName)
}
else
{
fireNode.isHidden = true
pauseSound(currentModelName)
}
}
}
let candleNodeName = "Cone_3"
if let candleNode = selectedNode.childNode(withName: candleNodeName, recursively: true) {
if let candleInnerNode = candleNode.childNode(withName: "Object_4", recursively: true) {
if candleInnerNode.isHidden
{
candleInnerNode.isHidden = false
playSound(currentModelName)
}
else {
candleInnerNode.isHidden = true
pauseSound(currentModelName)
}
}
}
let starOrbNodeName = "inner_0"
if let starOrbInnerNode = selectedNode.childNode(withName: starOrbNodeName, recursively: true) {
if let starOrbCenterNode = starOrbInnerNode.childNode(withName: "Object_4", recursively: true) {
if let starOrbNode = starOrbCenterNode.childNode(withName: "Object_0", recursively: true) {
if starOrbNode.isHidden {
starOrbNode.isHidden = false
playSound(currentModelName)
}
else {
starOrbNode.isHidden = true
pauseSound(currentModelName)
}
}
}
}
}
}
}
제스쳐 함수 (오브젝트 애니메이션)
@objc func handleLongPress(_ gesture: UILongPressGestureRecognizer) {
let location = gesture.location(in: sceneView)
switch gesture.state {
case .began:
let hitResults = sceneView.hitTest(location, options: nil)
if let hitResult = hitResults.first {
selectedNode = hitResult.node
while let parent = selectedNode?.parent, parent !== sceneView.scene.rootNode {
selectedNode = parent
}
originalNodePosition = selectedNode?.position
originalScale = selectedNode?.scale
if let selectedNode = selectedNode {
for i in 1...64 {
let nodeName = String(format: "Feu%02d", i)
if let fireNode = selectedNode.childNode(withName: nodeName, recursively: true) {
let scaleZAction = SCNAction.scaleZ(to: 5, duration: 5.0) adjustPivot(node: fireNode)
fireNode.runAction(scaleZAction)
}
}
let candleNodeName = "Cone_3"
if let candleNode = selectedNode.childNode(withName: candleNodeName, recursively: true) {
if let candleInnerNode = candleNode.childNode(withName: "Object_4", recursively: true) {
let scaleYAction = SCNAction.scaleY(to: 5, duration: 5.0) adjustPivot(node: candleInnerNode) candleInnerNode.runAction(scaleYAction)
if candleInnerNode.action(forKey: "scaleY") != nil {
let scaleYAction = SCNAction.scaleY(to: 1, duration: 5.0)
}
}
}
let starOrbNodeName = "inner_0"
if let starOrbInnerNode = selectedNode.childNode(withName: starOrbNodeName, recursively: true) {
if let starOrbCenterNode = starOrbInnerNode.childNode(withName: "Object_4", recursively: true) {
if let starOrbNode = starOrbCenterNode.childNode(withName: "Object_0", recursively: true) {
let scaleAction = SCNAction.scale(to: 5.0, duration: 2.5) starOrbNode.runAction(scaleAction)
if starOrbNode.action(forKey: "scale") != nil {
let scaleAction = SCNAction.scale(to: 1.0, duration: 2.5)
starOrbNode.runAction(scaleAction)
}
}
}
}
}
}
case .ended, .cancelled:
let hitResults = sceneView.hitTest(location, options: nil)
if let hitResult = hitResults.first {
selectedNode = hitResult.node
while let parent = selectedNode?.parent, parent !== sceneView.scene.rootNode {
selectedNode = parent
}
originalNodePosition = selectedNode?.position
originalScale = selectedNode?.scale
if let selectedNode = selectedNode {
for i in 1...64 {
let nodeName = String(format: "Feu%02d", i)
if let fireNode = selectedNode.childNode(withName: nodeName, recursively: true) {
if fireNode.action(forKey: "scaleZ") != nil {
let scaleZAction = SCNAction.scaleZ(to: 1, duration: 5.0) adjustPivot(node: fireNode)
fireNode.runAction(scaleZAction)
}
fireNode.removeAllActions()
}
}
let candleNodeName = "Cone_3"
if let candleNode = selectedNode.childNode(withName: candleNodeName, recursively: true) {
if let candleInnerNode = candleNode.childNode(withName: "Object_4", recursively: true) {
candleInnerNode.removeAllActions()
}
}
let starOrbNodeName = "inner_0"
if let starOrbInnerNode = selectedNode.childNode(withName: starOrbNodeName, recursively: true) {
if let starOrbCenterNode = starOrbInnerNode.childNode(withName: "Object_4", recursively: true) {
if let starOrbNode = starOrbCenterNode.childNode(withName: "Object_0", recursively: true) {
starOrbNode.removeAllActions()
}
}
}
}
}
selectedNode = nil
originalNodePosition = nil
originalScale = nil
startY = nil
originalZScale = nil
default:
break
}
}