使用SceneKit行原始types的笔触宽度

我正在尝试使用场景工具包复制此多维数据集图像形状(来自原始创build者的许可)。

在这里输入图像说明

到目前为止,我有线和顶点的绘图代码。 我不能使用图像,因为背景必须是透明的。

我正在尝试解决的具体问题是如何编辑SCNGeometryPrimitiveType.Line元素的描边宽度。

我创build线条的基本方式是这样的:

 private func squareVertices(length: Float) -> [SCNVector3] { let m = length/Float(2) let topLeft = SCNVector3Make(-mq, m+q, m+q) let topRight = SCNVector3Make( m+q, m+q, m+q) let bottomLeft = SCNVector3Make(-mq, -mq, m+q) let bottomRight = SCNVector3Make( m+q, -mq, m+q) return [topLeft, topRight, bottomLeft, bottomRight] } private func cubeFace() -> SCNGeometry { let vertices : [SCNVector3] = squareVertices(l) let geoSrc = SCNGeometrySource(vertices: UnsafePointer<SCNVector3>(vertices), count: vertices.count) // index buffer let idx1 : [Int32] = [0, 3] let data1 = NSData(bytes: idx1, length: (sizeof(Int32) * idx1.count)) let geoElements1 = SCNGeometryElement(data: data1, primitiveType: SCNGeometryPrimitiveType.Line, primitiveCount: idx1.count, bytesPerIndex: sizeof(Int32)) let idx2 : [Int32] = [1, 2] let data2 = NSData(bytes: idx2, length: (sizeof(Int32) * idx2.count)) let geoElements2 = SCNGeometryElement(data: data2, primitiveType: SCNGeometryPrimitiveType.Line, primitiveCount: idx2.count, bytesPerIndex: sizeof(Int32)) let geo = SCNGeometry(sources: [geoSrc], elements: [geoElements1, geoElements2]) return geo } private func setupFaceNodes() { // sides for i in 0..<4 { let face = SCNNode(geometry: cubeFace()) face.rotation = SCNVector4Make(0, 1, 0, Float(i) * Float(M_PI_2)) rootNode.addChildNode(face) } // top/bottom for i in [1, 3] { let face = SCNNode(geometry: cubeFace()) face.rotation = SCNVector4Make(1, 0, 0, Float(i) * Float(M_PI_2)) rootNode.addChildNode(face) } } 

我有一些看起来像这样的正确的整体形状:

在这里输入图像说明

但我无法弄清楚如何增加使用SceneKit绘制线条的宽度。 我怎样才能做到这一点?

对于那些感兴趣的, 这里是一个示例项目。

SceneKit不为此提供控制。 不过,SceneKit使用OpenGL ES绘制,

GL_LINES模式下使用GL进行绘制时, glLineWidth调用将更改线宽。 (注意:参数是以实际像素为单位,而不是UI布局点,所以如果您不想在Retina显示屏上使用超细细线,则需要比您想象的更大的宽度。)

那么,你在SceneKit应用程序中的哪个位置调用? 那里有几个选项。 在像你这样简单的场景中,只渲染一个东西,可以在场景渲染之前进行设置。 为您的视图设置一个委托 ,然后实现renderer:willRenderSceneAtTime:glLineWidth那里调用glLineWidth

但是,OpenGL的线条渲染是相当有限的 – 如果你想自定义渲染更多,你需要一个不同的方法。 哪种方法最好取决于你要做什么,所以这里有一些你想研究的想法:

  • 从狭窄的三angular形条上制作你的“线条”
  • 从原始的SCN几何形状,如盒子和圆柱体
  • 保持简单的立方体几何体,但是使用片段着色器(或着色器修改器片段)仅在每个多边形的边缘附近绘制

您可以使用glLineWidth设置线宽。
确保在您的项目中包含OpenGLES。

线宽8

这里是你的多维数据集看起来像线宽设置为8。