SceneKit:允许相机节点沿 X 轴和 Y 轴平移
SceneKit: allow panning along X-axis and Y-axis for camera node
目标是在SceneKit中模拟一个摄像头,让用户通过平移屏幕来平移摄像头的视角。
下面的代码模拟了相机在水平方向上的平移,但是你如何解释同时在垂直方向上的平移?
您是否可以再一次旋转,但改变 X 轴并基于 translation.y(以获得垂直平移的用户数量)?或者有更好的方法吗?
func doPan(sender: UIPanGestureRecognizer) {
// Get horizonal pan distance & convert to radians
let translation = sender.translationInView(sender.view!)
var xRadians = GLKMathDegreesToRadians(Float(translation.x))
// Rotate camera
xRadians = (xRadians / 20) + currentAngle
cameraNode.transform = SCNMatrix4MakeRotation(xRadians, 0, 1, 0)
// Update preview block
setPreviewBlock(cameraNode.position)
// Save value for next rotation
if (sender.state == UIGestureRecognizerState.Ended) {
currentAngle = xRadians
}
}
您可以将旋转矩阵相乘以获得新的变换。
另一种方法是使用相机节点的 eulerAngles
属性。 transform
、eulerAngles
和 orientation
都控制节点的旋转,但它们使用不同的参数化。
请参阅 Rotate SCNCamera node looking at an object around an imaginary sphere 了解完整的 answer/explanation 相机旋转。
另一种方法是旋转场景而不是移动相机。看看 SCNAction
、rotateBy...
和 rotateTo...
函数。
目标是在SceneKit中模拟一个摄像头,让用户通过平移屏幕来平移摄像头的视角。
下面的代码模拟了相机在水平方向上的平移,但是你如何解释同时在垂直方向上的平移?
您是否可以再一次旋转,但改变 X 轴并基于 translation.y(以获得垂直平移的用户数量)?或者有更好的方法吗?
func doPan(sender: UIPanGestureRecognizer) {
// Get horizonal pan distance & convert to radians
let translation = sender.translationInView(sender.view!)
var xRadians = GLKMathDegreesToRadians(Float(translation.x))
// Rotate camera
xRadians = (xRadians / 20) + currentAngle
cameraNode.transform = SCNMatrix4MakeRotation(xRadians, 0, 1, 0)
// Update preview block
setPreviewBlock(cameraNode.position)
// Save value for next rotation
if (sender.state == UIGestureRecognizerState.Ended) {
currentAngle = xRadians
}
}
您可以将旋转矩阵相乘以获得新的变换。
另一种方法是使用相机节点的 eulerAngles
属性。 transform
、eulerAngles
和 orientation
都控制节点的旋转,但它们使用不同的参数化。
请参阅 Rotate SCNCamera node looking at an object around an imaginary sphere 了解完整的 answer/explanation 相机旋转。
另一种方法是旋转场景而不是移动相机。看看 SCNAction
、rotateBy...
和 rotateTo...
函数。