con*_*are 9 drawing ios scenekit swift scnnode
我正在尝试使用场景工具包复制此立方体图像形状(获得原始创建者的许可).

到目前为止,我有线条和顶点的绘图代码.我无法使用图像,因为背景必须是透明的.
我正在尝试解决的具体问题是如何编辑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)
}
}
Run Code Online (Sandbox Code Playgroud)
我有一些具有正确整体形状的东西:

但我无法弄清楚如何增加使用SceneKit绘制的线条的宽度.我怎样才能做到这一点?
对于那些感兴趣的人,这是一个示例项目.
SceneKit不为此提供控件.但是,SceneKit使用OpenGL ES进行绘制.
在GL_LINES模式下使用GL绘图时,glLineWidth调用会更改线宽.(注意:参数是实际像素,而不是UI布局点,所以如果你不想在Retina显示屏上使用超薄细线,你需要比你想象的更大的宽度.)
那么,你在SceneKit应用程序中将其称为何处?你有几个选择.在像你这样的简单场景中,你只渲染一件事,你可以在场景渲染之前设置它.为您的视图设置一个委托,然后在那里实现renderer:willRenderSceneAtTime:并调用glLineWidth.
但是,OpenGL线渲染非常有限 - 如果要更多地自定义渲染,则需要采用不同的方法.哪种方法效果最好取决于您的具体目标,所以这里有一些想法供您研究:
| 归档时间: |
|
| 查看次数: |
6878 次 |
| 最近记录: |