Ich habe eine Szene Setup mit SCNCamera, die um ein Objekt dreht.SCNCamera Begrenzung Arcball Rotation
Was wäre der beste Weg, um den Umfang der Drehung zu begrenzen, den die Kamera um das Objekt herum erreichen kann?
Beispiel: Wie würde ich die Rotation auf eine einzige Hemisphäre beschränken, anstatt sich um eine ganze Kugel drehen zu können?
Mein erster Versuch war zu sehen, ob es Klemmen für .allowsCameraControl gab. Konnte nichts finden.
Ich versuchte dann C# Einheit: mouse orbit script, kein Glück.
Einige Hinweise darauf, wie man sich nähert oder löst, wären großartig.
Boilerplate Arcball dank 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
}
}
Ich glaube nicht, dass die Modul 1 Operation das gewünschte Ergebnis haben wird ('widthRatio% 1'). Der widthRatio wird von -1 bis 1 variieren, aber wenn ein Benutzer das Limit überschreitet, kann sich der Wert von -0,9 auf -1,2 ändern. Der Modulus wird angewendet, was zu einem Wert von 0,2 führt, was einen abrupten Sprung zur anderen Seite der Kugel bewirkt. Eine Möglichkeit wäre, 2 zu addieren, wenn der Wert unter -1 fällt, und 2 zu subtrahieren, wenn das Ende der Rotation über 1 liegt. Bei Verwendung dieser Methode würde der Übergang von der -0,9 Position zu -1,2 zu einem Wert führen von 0,8, was ich glaube, ist das gewünschte Ergebnis. –