Я получил эти функции, которые масштабируют и перемещают 3D-объект, отображаемый на экране при нажатии на него.Проблема состоит в том, что если я переместлю или масштабирую узел (трехмерный объект), он будет только увеличивать или уменьшать одну часть узла, и я хочу масштабировать все.
Я знаю, что одним из решений является объединение 3D-объекта в Blender как одного, но позже я хочу добавить определенную анимацию к определенным узлам, и поэтому я не хочу присоединяться к ним.
Вот код, который я использую для масштабирования и перемещения объектов:
@objc func panned(recognizer :UIPanGestureRecognizer)
{
//This function is for scaling
if recognizer.state == .changed
{
guard let sceneView = recognizer.view as? ARSCNView
else
{
return
}
let touch = recognizer.location(in: sceneView)
let translation = recognizer.translation(in: sceneView)
let hitTestResults = self.sceneView.hitTest(touch, options: nil)
if let hitTest = hitTestResults.first
{
let planeNode = hitTest.node
self.newAngleY = Float(translation.x) * (Float) (Double.pi)/180
self.newAngleY += self.currentAngleY
planeNode.eulerAngles.y = self.newAngleY
}
else if recognizer.state == .ended
{
self.currentAngleY = self.newAngleY
}
}
}
А этот:
@objc func pinched(recognizer :UIPinchGestureRecognizer)
{
if recognizer.state == .changed
{
guard let sceneView = recognizer.view as? ARSCNView
else
{
return
}
}
let touch = recognizer.location(in: sceneView)
let hitTestResults = self.sceneView.hitTest(touch, options: nil)
if let hitTest = hitTestResults.first
{
let planeNode = hitTest.node
let pinchScaleX = Float(recognizer.scale) * planeNode.scale.x
let pinchScaleY = Float(recognizer.scale) * planeNode.scale.y
let pinchScaleZ = Float(recognizer.scale) * planeNode.scale.z
planeNode.scale = SCNVector3(pinchScaleX, pinchScaleY, pinchScaleZ)
recognizer.scale = 1
}
}
Я не знаю, еслиэто помогает, но вот изображение узлов: Изображение узлов
Заранее спасибо!