我在 3D 编程方面遇到了更多的数学问题,我希望你能帮助我!
我正在尝试使用具有等角度的 Scenekit 创建 3D 游戏。
这段代码创建了我的正交相机:
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 世界中未投影的位置应保持不变。
我考虑过计算 2D 平移到 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 轴上的差异设置为零。
2 回答
我找到了自己的解决方案。
我正在计算手势(P1-P2)的起始位置处的光线和翻译位置(Q1-Q2)处的光线。现在我有两条光线,让两条光线都与 XY 平面相交,以接收点 P0 和 Q0
P0 和 Q0 的差异是未投影的翻译。
这种技术也适用于 non-orthogonal 相机,但我还没有测试过。
在我看来它是有效的,但如果有人能在数学上证实这个假设,我会很高兴看到:)
这是代码:
我已经计算了等距平移的方程式,代码如下。
要获得正确的缩放,您需要将 screenheight 用作 orthographicScale 的变量。我在这里使用的缩放是 30 倍放大,注意 30 也用于上面代码中的常量。