1

我有一些带有透视投影的相机和(0,0,0)中的对象。我根据这个相机计算了这个对象的“边界框”(屏幕上的像素大小)并缩放它以适应屏幕大小。现在它在屏幕中间。

scnView 的框架等于屏幕大小,并且我在此视图上方有一些 UI 组件(例如导航栏和视图底部的一些大透明视图)。scnView 有一些全屏背景,这个对象可以缩放/移动/......因此我需要 scnview 全屏。

那样的

然后我将这个对象移动到“透明区域”(没有 UIComponents 的区域)的中间,并看到这个对象的底部(好像它在我的上方),因为我的投影是透视的。

我想把这个物体移动到清晰区域的中心,让它看起来像在我面前,没有任何扭曲。我怎样才能做到这一点?

在此处输入图像描述

我看到了 2 个解决方案。1)在纹理中将我的对象绘制到屏幕外,然后在屏幕上所需位置绘制此纹理。2)创建 scnView 高一点。例如将帧大小设置为 = (0, (bottomHeight - topHeight) / 2, width, height + (bottomHeight - topHeight) / 2) 以将 scnView 的中心移动到所需位置。

但是我不喜欢第一个解决方案,因为添加了绘制调用,而第二个解决方案甚至听起来很糟糕。

PS对不起那张照片

更新:基本上我想使用透视投影并像 SceneKit 中的 2D 图像一样移动 3D 对象。

4

3 回答 3

1

抱歉,如果我没有正确理解,但是您可以将相机扫射并居中吗,还是不够清楚?

func strafeY(vAmount: XFloat)
{
  nPosition = cgVecAdd(v1: nPosition, v2: cgVecScalarMult(v: nTarget, s: vAmount))
}
于 2018-05-07T21:13:35.727 回答
1

试试这个...生成一个新的场景包游戏项目,然后用下面的代码替换默认旋转。

将对象向上移动时稍微旋转 X,以“稍微”保持与眼睛的关系。

您可以创建一个类似但单独的例程来执行较小的增量以使其平滑。

    ship.runAction(SCNAction.rotateBy(x: CGFloat(GLKMathDegreesToRadians(-90)), y: 0, z: 0, duration: 0))

    let vRotateAmount: Float = 3

    let vAction1 =  SCNAction.move(to: SCNVector3Make(0, 1, 0), duration: 1)
    let vAction1a = SCNAction.rotateBy(x: CGFloat(GLKMathDegreesToRadians(vRotateAmount)), y:0, z:0, duration: 1)

    let vAction2 = SCNAction.move(to: SCNVector3Make(0, 2, 0), duration: 1)
    let vAction2a = SCNAction.rotateBy(x: CGFloat(GLKMathDegreesToRadians(vRotateAmount)), y:0, z:0,  duration: 1)

    let vAction3 =  SCNAction.move(to: SCNVector3Make(0, 1, 0), duration: 1)
    let vAction3a = SCNAction.rotateBy(x: CGFloat(GLKMathDegreesToRadians(-vRotateAmount)), y:0, z:0,  duration: 1)

    let vAction4 = SCNAction.move(to: SCNVector3Make(0, 0, 0), duration: 1)
    let vAction4a = SCNAction.rotateBy(x: CGFloat(GLKMathDegreesToRadians(-vRotateAmount)), y:0, z:0,  duration: 1)

    let seq = SCNAction.sequence([vAction1, vAction1a, vAction2, vAction2a, vAction3, vAction3a, vAction4, vAction4a])
    let allSeq = SCNAction.repeatForever(seq)
    ship.runAction(allSeq)
于 2018-05-31T04:09:12.387 回答
0

通过更改相机 projectionTransform 解决了这个问题。喜欢:

let newMatrix = SCNMatrix4Mult(initialProjectionCameraMatrix, translationMatrix)
于 2018-06-06T12:49:00.133 回答