我在(0,0,0)中有一些带透视投影和物体的相机。 我根据这个相机计算了该对象的“边界框架”(屏幕上的像素大小),并将其缩放以适合屏幕尺寸。现在它在屏幕中间。
scnView的框架等于屏幕大小,我在此视图上方有一些UI组件(例如导航栏和视图底部的一些大透明视图)。 scnView有一些全屏背景,这个对象可以缩放/移动/ ...因此我需要scnview全屏。
然后我将这个对象移动到“clear area”(没有UIComponents的区域)的中间并看到这个对象的底部(好像它在我之上),因为我的投影是透视。
我想将这个物体移动到清晰区域的中心,看到它在我面前没有任何失真。我怎样才能做到这一点?
我看到2个解决方案。 1)在纹理中在屏幕外绘制我的对象,然后在屏幕上以所需位置绘制此纹理。 2)创建scnView有点高。例如,将帧大小设置为=(0,(bottomHeight - topHeight)/ 2,width,height +(bottomHeight - topHeight)/ 2)将scnView的中心移动到所需位置。
但我不喜欢第一个解决方案,因为添加绘制调用和第二个解决方案甚至听起来很糟糕。
P.S。对不起那张照片
更新:基本上我想使用透视投影并像在SceneKit中的2D图像一样移动3D对象。
答案 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)