Ho una configurazione scena con SCNCamera che ruota attorno a un oggetto.Rotazione arcball limite SCNCamera
Quale sarebbe il modo migliore per limitare i limiti di rotazione che la fotocamera può raggiungere attorno all'oggetto?
Esempio: invece di essere in grado di ruotare attorno a un'intera sfera, come limitarei la rotazione a un singolo emisfero?
Il mio primo tentativo è stato quello di verificare se ci fossero dei morsetti per .allowsCameraControl. Non ho trovato nulla.
Ho quindi provato ad adattare C# Unity: mouse orbit script, senza fortuna.
Alcuni indicatori su come affrontare o risolvere questo sarebbe grandioso.
Boilerplate dell'arco di rotazione grazie alla this answer.
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
}
}
Non penso che l'operazione modulo 1 avrà il risultato desiderato ('widthRatio% 1'). WidthRatio varierà da -1 a 1, ma quando un utente supera il limite, il valore può variare da -0.9 a, ad esempio, -1.2. Il modulo viene applicato, risultando in un valore di 0,2, causando un brusco salto all'altro lato della sfera. Un modo per aggirare sarebbe aggiungere 2 se il valore scende al di sotto di -1 e sottrarre 2 se la fine della rotazione è superiore a 1. Usando tale metodo, passando da -0.9 a -1.2 si otterrebbe un valore di 0,8, che credo sia il risultato desiderato. –