私は、SCNCameraを使ってシーンの周りを回転するシーン設定をしています。SCNCカメラリミットアークボール回転
カメラがオブジェクトの周りを回転できる範囲を制限するにはどうすればよいでしょうか?
例:球全体を回転するのではなく、回転を単一の半球に制限するにはどうすればよいですか?
初めての試みは、.allowsCameraControlのクランプがあるかどうかを確認することでした。何も見つかりませんでした。
次に、C#Unity:mouse orbit script、no luckを適応させてみました。
これにアプローチする方法や解決する方法についてのいくつかの指針は素晴らしいでしょう。
定型アークボール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
}
}
モジュラス1の操作では、望む結果( 'widthRatio%1')はほとんどないと思います。 widthRatioは-1から1まで変化しますが、ユーザーが制限を超えて回転すると、値は-0.9から-1.2に変更される可能性があります。モジュラスが適用され、0.2の値が得られ、球の反対側に突然ジャンプします。 値が-1より小さい場合は2を加算し、回転の終了が1より大きい場合は2を減算することです。その方法を使用すると、-0.9の位置から-1.2の値に移動すると値0.8の値が得られました。 –