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

问题描述 投票:0回答:1

一般来说,我想要实现的目标是:我们的地图数据在历史上都是二维的,我们使用的坐标系是左上角的原点(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)

这正是我想要的,但有一个大问题。它会反转所有几何体面,因此除非我更改其材质的剔除模式,否则我的几何体会消失:

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 的所有子节点的几何面法线?理想情况下,这完全可以通过实际场景上的设置,或者通过根节点或相机上的变换来实现。

swift opengl 3d scenekit
1个回答
0
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.