更改SceneKit

时间:2018-05-07 20:12:34

标签: ios scenekit scnnode scncamera

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

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

smth like that

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

我想将这个物体移动到清晰区域的中心,看到它在我面前没有任何失真。我怎样才能做到这一点?

enter image description here

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

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

P.S。对不起那张照片

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

3 个答案:

答案 0 :(得分:1)

很抱歉,如果我没有正确理解,但是你可以将相机拉近并使其居中,还是不够清晰?

func strafeY(vAmount: XFloat)
{
  nPosition = cgVecAdd(v1: nPosition, v2: cgVecScalarMult(v: nTarget, s: vAmount))
}

答案 1 :(得分:1)

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

将物体移动到"有点"稍微旋转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)

答案 2 :(得分:0)

通过更改相机projectionTransform解决它。 Smth喜欢:

let newMatrix = SCNMatrix4Mult(initialProjectionCameraMatrix, translationMatrix)