我有一個更多的數學問題與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