У меня есть настройка сцены с помощью SCNCamera, которая вращается вокруг объекта.
Каков наилучший способ ограничить степень вращения камеры вокруг объекта?
Пример: вместо того, чтобы вращаться вокруг всей сферы, как бы я ограничил вращение одним полушарием?
Моя первая попытка состояла в том, чтобы посмотреть, есть ли зажимы для .allowsCameraControl. Ничего не нашел.
Затем я попытался адаптировать С# Unity: скрипт орбиты мыши, но не повезло.
Некоторые указатели на то, как подойти или решить это, были бы замечательными.
Шаблон Arcball благодаря этому ответу .
var lastWidthRatio: Float = 0
var lastHeightRatio: Float = 0
let camera = SCNCamera()
let cameraNode = SCNNode()
let cameraOrbit = SCNNode()
override func viewDidLoad() {
super.viewDidLoad()
// create a new scene
let scene = SCNScene(named: "art.scnassets/ship.scn")!
// create and add a camera to the scene
camera.usesOrthographicProjection = true
camera.orthographicScale = 9
camera.zNear = 0
camera.zFar = 100
cameraNode.position = SCNVector3(x: 0, y: 0, z: 50)
cameraNode.camera = camera
cameraOrbit.addChildNode(cameraNode)
scene.rootNode.addChildNode(cameraOrbit)
// retrieve the ship node
let ship = scene.rootNode.childNodeWithName("ship", recursively: true)!
// retrieve the SCNView
let scnView = self.view as! SCNView
// set the scene to the view
scnView.scene = scene
// add a tap gesture recognizer
let gesture = UIPanGestureRecognizer(target: self, action: "panDetected:");
scnView.addGestureRecognizer(gesture);
}
func panDetected(sender: UIPanGestureRecognizer) {
let translation = sender.translationInView(sender.view!)
let widthRatio = Float(translation.x) / Float(sender.view!.frame.size.width) + lastWidthRatio
let heightRatio = Float(translation.y) / Float(sender.view!.frame.size.height) + lastHeightRatio
self.cameraOrbit.eulerAngles.y = Float(-2 * M_PI) * widthRatio
self.cameraOrbit.eulerAngles.x = Float(-M_PI) * heightRatio
print(Float(-2 * M_PI) * widthRatio)
if (sender.state == .Ended) {
lastWidthRatio = widthRatio % 1
lastHeightRatio = heightRatio % 1
}
}
widthRatio % 1
). ШиринаRatio будет варьироваться от -1 до 1, но когда пользователь переходит за ограничение, значение может измениться с -0,9 до, скажем, -1,2. Применяется модуль, в результате чего получается значение 0,2, вызывающее резкий скачок на другую сторону сферы. Один из способов обойти это было бы добавить 2, если значение падает ниже -1, и вычесть 2, если конец вращения выше 1. Используя этот метод, перемещение от позиции -0,9 до -1,2 приведет к значению 0,8 , что я считаю желаемым результатом. - person Dave Ruske   schedule 17.01.2016