我有一个更多的数学问题与3D编程,我希望你能帮助我!场景套件平移二维平移到正确的三维只有水平
我想创建一个3D等距角度的场景使用Scenekit。
此代码创建我正视相机:
var cameraNode = SCNNode()
cameraNode.camera = SCNCamera()
cameraNode.name = "Camera"
cameraNode.position = SCNVector3Make(-5.0, -5.0, 10.0)
cameraNode.eulerAngles = SCNVector3Make(PI/3.0, 0.0, -PI/4.0)
cameraNode.camera?.usesOrthographicProjection = true
cameraNode.camera?.orthographicScale = 7.0
scene.rootNode.addChildNode(cameraNode)
现在我想用移动手势移动相机,产生滚动的感觉。为了实现这一点,相机不应该垂直移动,只能水平移动。屏幕上的触摸位置和3D世界中未投影的位置在移动时应保持不变。
我想过计算二维平移到三维差异和忽略垂直分量。这段代码实际上起作用并几乎产生了期望的结果,但速度不正确。如果我摇摄,相机似乎加速并不能正确反应:
var previousTranslation = CGPointMake(0.0, 0.0)
func pan(gesture: UIPanGestureRecognizer)
{
let view = self.view as SCNView
let translation = gesture.translationInView(view)
let location = gesture.locationInView(view)
let diffTrans = translation - previousTranslation
previousTranslation = translation
let cameraNode = scene.rootNode.childNodeWithName("Camera", recursively: false)
let worldPointTrans = view.unprojectPoint(SCNVector3Make(-Float(diffTrans.x), -Float(diffTrans.y), 0.0))
let worldPoint0 = view.unprojectPoint(SCNVector3Make(0.0, 0.0, 0.0))
var diff = worldPointTrans - worldPoint0
diff.x = diff.x/Float(cameraNode!.camera!.orthographicScale)
diff.y = diff.y/Float(cameraNode!.camera!.orthographicScale)
diff.z = 0
cameraNode?.position += diff
}
有谁知道计算屏幕转换成水平的3D转换,忽略了垂直轴的复杂的方法?
预先感谢您:)
编辑: 泛适用于水平翻译了。但不适用于垂直,因为我将z轴上的差异设置为零。
你从不使用“diffTrans”。当你解除保护(而不是“翻译”)时,你不想使用“diffTrans”吗?否则,您将在每次迭代时积累翻译。 – Toyos 2014-12-07 22:19:55
谢谢你指出这一点!我尝试了很多不同的方法,我没有看到那个错误。它解决了水平平移但不垂直的问题,因为世界翻译中不需要的垂直分量 – 2014-12-09 06:03:25
检查出答案rickster答案在这里:http://stackoverflow.com/questions/25150737/how-to-use- ios-swift-scenekit-scnscenerenderer-unprojectpoint-properly 在最后关于处理未投影时,他的相机与“世界”不一样。这可能是一个有用的起点。 – 2014-12-15 23:51:17