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了解更多信息。
| 归档时间: |
|
| 查看次数: |
509 次 |
| 最近记录: |