SceneKit反转Y轴而不反转几何法线

use*_*447 6 opengl 3d scenekit swift

通常我想要实现的目标:我们的地图数据历史上都是2D,我们使用的坐标系是左上角的原点(0,0),正x向右,正y向下.我们现在通过添加z轴,从屏幕出来的正z向您添加3D数据(想想自上而下的地图视图).这是一个左手坐标系,但SceneKit是一个右手坐标系.我想在SceneKit场景的顶层应用一些变换,它将场景转换为左手坐标系,这样我就可以根据自定义贴图坐标系修改/定位/添加节点到场景中.工作.

到目前为止我有这个:

let scene = SCNScene()

let cameraNode = SCNNode()
cameraNode.camera = SCNCamera()
cameraNode.scale = SCNVector3(1,-1,1)
scene.rootNode.addChildNode(cameraNode)
Run Code Online (Sandbox Code Playgroud)

这实现了我想要的,但有一个大问题.它会反转所有几何面,所以除非我更改材质的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)
Run Code Online (Sandbox Code Playgroud)

mapPlane根本不显示!您必须将相机旋转mapPlane到底部才能看到它.您可以通过添加一行来轻松解决此问题:

mapPlane.geometry?.firstMaterial?.cullMode = .Front
Run Code Online (Sandbox Code Playgroud)

但我不想为每个几何/材料更改cullMode.有没有办法在不需要每个几何/材料的额外代码的情况下实现这一目标?对于rootNode的所有子节点,有些转换会反转几何面正常吗?理想情况下,这完全可以通过实际场景上的设置,或通过rootNode或摄像机上的变换来实现.

小智 0

您可以在 OpenGL 中更改正面与背面的缠绕顺序,这会更改哪个面被视为正面。这是一个全局状态,因此应该适用于所有基元。

请参阅https://www.khronos.org/opengl/wiki/Face_Culling了解更多信息。