我正从场景套件api转移到金属api。必须在节点上进行转换。
在场景套件中,我只需设置
即可let camera = SCNCamera()
camera.zFar = 10000
camera.zNear = 0.1
camera.xFov = 93.299
camera.yFov = 77.65614
let cameraNode = SCNNode()
cameraNode.camera = camera
cameraNode.position = SCNVector3Make(0, 10, 0)
cameraNode.eulerAngles = SCNVector3Make(-2.degreesToRadians, 0, 0)
cameraNode.name = "CameraNode"
scene.rootNode.addChildNode(cameraNode)
let plane = SCNPlane(width:1, height:1)
plane.firstMaterial?.diffuse.contents = UIColor.blueColor()
plane.firstMaterial?.doubleSided = true
let node = SCNNode(geometry: plane)
node.position = SCNVector3Make(0, 0, 55)
node.eulerAngles = SCNVector3Make(90.degreesToRadians, -47.degreesToRadians, 0)
node.scale = SCNVector3Make(169, 169, 169)
scene.rootNode.addChildNode(node)
但是在金属中无法设置eulerAngles并基于xFieldOfView和yFieldOfView创建投影变换。截至目前,我正在使用所有矩阵计算的GLKIT
模型矩阵 - 这里我按ZYX顺序进行旋转(因为这就是场景工具包对提供的euler角度的作用)(使用节点属性)
var modelMatrix = GLKMatrix4MakeZRotation(0)
modelMatrix = GLKMatrix4RotateY(modelMatrix, -47.degreesToRadians)
modelMatrix = GLKMatrix4RotateX(modelMatrix, 90.degreesToRadians)
modelMatrix = GLKMatrix4Translate(modelMatrix, 0, 0, 100)
modelMatrix = GLKMatrix4Scale(modelMatrix, 169, 169, 169)
查看矩阵(使用摄像机节点属性)
var viewMatrix = GLKMatrix4MakeTranslation(0, 10, -0)
viewMatrix = GLKMatrix4RotateZ(viewMatrix, 0)
viewMatrix = GLKMatrix4RotateY(viewMatrix, 0)
viewMatrix = GLKMatrix4RotateX(viewMatrix,-2.degreesToRadians)
透视变换(使用相机属性)
let projectionMatrix = GLKMatrix4MakePerspective(77.65614, Float(1024/682.66666666666674), 0.1, 10000)
这里1024和682.66666666666674是我的视图的高度和宽度。
场景套件的输出和金属输出不一样。由于某种原因,飞机总是在金属套件的上半部分渲染,但是在场景套件中它渲染在下半部分(这是我想要的)并且调整金属中的yFieldOfView会改变平面是否在上半部分渲染或者下半部分以及金属视图中输出平面的缩放和旋转与场景套件不同。
我的问题是: 1. SceneKit坐标系使用前面的+ z和后面的-z。而Metal在前面使用-z,在后面使用+ z。 在金属中,将简单地将所有z旋转和平移值乘以-1来固定它吗?
如何在金属中进行欧拉角。我经历了几个链接和堆栈溢出答案,我的理解是,欧拉角是每个轴上的旋转并按特定顺序相乘。在这里,我乘以zyx顺序,因为场景工具包使用它。
如何使用xFieldOfView和yFieldOfView生成perspectiveMatrix。我正在使用GLKMatrix进行所有矩阵变换。它没有像场景套件那样的功能。我将viewWidth / viewHeight作为方面的值传递。如何从xFieldOfView和yFieldOfView生成方面。这就简单吗? aspect = xFieldOfView / yFieldOfView或者是不同的东西。有这个图书馆https://github.com/nicklockwood/VectorMath/blob/master/VectorMath/VectorMath.swift 它使用xFieldOfView / yFieldOfView
当我在场景工具包中创建平面时,我按如下方式设置平面的大小 let plane = SCNPlane(宽度:1,高度:1)
尺寸是否与金属有关?在金属中,夹子空间沿着所有轴从-1到1。在金属中你可以通过相应地生成平面顶点来设置平面的大小我尝试生成从-1到1的顶点(这里宽度和高度是2.)和-0.5到0.5(这里的宽度和高度是1)。但它并没有给我正确的结果。
基本上我想将场景套件代码移植到具有相同输出的金属。任何帮助非常感谢。
由于