具有SceneKit线图元类型的笔划宽度(http://beesandbombs.tumblr.com/post/96195652814/cube)) using scene kit.
我试图立刻解决具体是如何编辑的笔画宽度的SCNGeometryPrimitiveType.Line元素。
我创建线条的基本方法是这样的:
private func squareVertices(length: Float) -> [SCNVector3] { let m = length/Float(2) let topLeft = SCNVector3Make(-m-q, m+q, m+q) let topRight = SCNVector3Make( m+q, m+q, m+q) let bottomLeft = SCNVector3Make(-m-q, -m-q, m+q) let bottomRight = SCNVector3Make( m+q, -m-q, 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进行绘制。
SceneKit
OpenGL ES
在GL_LINES模式下使用GL绘制时,glLineWidth调用会 更改线宽。(请注意:该参数以实际像素为单位,而不是以UI 布局点为单位,因此,如果您不希望在视网膜显示屏上使用超细的细线,则需要的宽度要比您想象的要大。)
那么,您在SceneKit应用程序中该怎么称呼它?您在那里有一些选择。在像您这样的简单场景中,您只渲染一件事,您可以在场景渲染之前进行设置。 为您的视图设置一个 委托,然后在其中实现 并调用。renderer:willRenderSceneAtTime:glLineWidth
renderer:willRenderSceneAtTime:glLineWidth
但是,OpenGL线条渲染非常有限-如果要自定义 更多渲染,则需要使用其他方法。哪种方法 最有效取决于您要做什么,所以这里有一些想法可供您 研究:
从狭窄的三角形条上制作“线条” 根据原始SCN几何形状(例如盒子和圆柱体)制作它们 保持简单的立方体几何体,但使用片段着色器(或着色器修改器片段)仅在每个多边形的边缘附近绘制