我正在尝试使用场景工具包复制此立方体图像形状(获得
original creator的许可).
到目前为止,我有线和顶点的绘图代码.我无法使用图像,因为背景必须是透明的.
我正在尝试解决的具体问题是如何编辑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) let bottomLeft = SCNVector3Make(-m-q,-m-q,m+q) let bottomRight = SCNVector3Make( 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,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,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,Float(i) * Float(M_PI_2)) rootNode.addChildNode(face) } }
我有一些具有正确整体形状的东西:
但我无法弄清楚如何增加使用SceneKit绘制的线条的宽度.我怎样才能做到这一点?
对于那些感兴趣的人,here是一个样本项目.
解决方法
SceneKit不为此提供控件.但是,SceneKit使用OpenGL ES进行绘制.
在GL_LINES模式下使用GL绘图时,glLineWidth调用会更改线宽. (注意:参数是实际像素,而不是UI布局点,所以如果你不想在Retina显示屏上使用超薄细线,你需要比你想象的更大的宽度.)
那么,你在SceneKit应用程序中将其称为何处?你有几个选择.在像你这样的简单场景中,你只渲染一件东西,你可以在场景渲染之前设置它.为您的视图设置一个delegate,然后实现renderer:willRenderSceneAtTime:
并在那里调用glLineWidth.
但是,OpenGL线渲染非常有限 – 如果要自定义渲染,则需要采用不同的方法.哪种方法最有效取决于您的具体目标,所以这里有一些想法供您研究:
>从窄三角形条带中制作“线条”>使用原始SCN几何图形(如方框和圆柱体)制作它们>保留一个简单的立方体几何体,但使用片段着色器(或着色器修改器片段)仅在每个多边形的边缘附近绘制