一般来说我正在努力实现:我们的地图数据在历史上都是2D,我们使用的坐标系是左上角的原点(0,0),正x向右,正y去下。我们现在通过添加z轴添加3D数据,从屏幕出来的正z朝向您(想想自上而下的地图视图)。这是一个左手坐标系,但SceneKit是一个右手坐标系。我想在SceneKit场景的顶层应用一些变换,它将场景转换为左手坐标系,这样我就可以根据自定义贴图坐标系修改/定位/添加节点到场景中。工作。
到目前为止,我有这个:
let scene = SCNScene()
let cameraNode = SCNNode()
cameraNode.camera = SCNCamera()
cameraNode.scale = SCNVector3(1,-1,1)
scene.rootNode.addChildNode(cameraNode)
这实现了我想要的,但有一个大问题。它会反转所有几何面,所以除非我更改材质的cullMode,否则我的几何图形会消失:
let mapLength = 1000 //max X axis
let mapWidth = 800 //max Y axis
let mapHeight = 100 //max Z axis
cameraNode.position = SCNVector3(mapLength / 2, mapWidth / 2, 2000)
let mapPlane = SCNNode()
mapPlane.position = SCNVector3(mapLength / 2, mapWidth / 2, 0)
mapPlane.geometry = SCNPlane(width: mapLength, height: mapWidth)
mapPlane.geometry?.firstMaterial?.diffuse.contents = UIColor.blackColor()
scene.rootNode.addChildNode(mapPlane)
mapPlane
根本没有显示!您必须将相机旋转到mapPlane
的下方才能看到它。您可以通过添加一行来轻松解决此问题:
mapPlane.geometry?.firstMaterial?.cullMode = .Front
但我不想为每个几何/材质更改cullMode。有没有办法在不需要每个几何/材料的额外代码的情况下实现这一目标?对于rootNode的所有子节点,某些转换会反转几何面的法线?理想情况下,这可以完全通过实际场景上的设置,或通过rootNode或相机上的变换来实现。