ios - 具有 SceneKit 线条基元类型的笔划宽度

标签 ios swift drawing scenekit scnnode

我正在尝试使用场景工具包复制这个立方体图像形状(已获得 original creator 的许可)。

enter image description here

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

我现在要解决的具体问题是如何编辑 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)
    }
}

我有一个整体形状正确的东西:

enter image description here

但我不知道如何增加使用 SceneKit 绘制的线条的宽度。我怎样才能做到这一点?

有兴趣者,here是一个示例项目。

最佳答案

SceneKit 不为此提供控件。但是,SceneKit 使用 OpenGL ES 进行绘制。

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

那么,您在 SceneKit 应用程序中的什么地方调用它?你有几个选择。在像你这样的简单场景中,你只渲染一件东西,你可以在场景渲染之前设置它。设置一个delegate为了你的观点,然后实现 renderer:willRenderSceneAtTime:并在那里调用 glLineWidth

但是,OpenGL 线渲染非常有限——如果您想更多地自定义渲染,您将需要一种不同的方法。哪种方法最有效取决于您的具体目标,因此这里有一些想法供您研究:

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

关于ios - 具有 SceneKit 线条基元类型的笔划宽度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26705321/

相关文章:

ios - 为什么我的 iOS 应用打开后突然开始崩溃?

ios - 如何在 viewController 转换期间释放内存

java - Java 中的图像、绘图和操作框架?

c++ - 循环绘制特定坐标

ios - 将 UITableView 单元格添加到数组中

ios - WatchKit 错误 - 无法找到要实例化的接口(interface) Controller 类 ''

ios - 如何使用 Core Data 制作索引列表 TableView ,iOS Dev

swift - 如何在 Swift 中为我的文本框设置一个 Id

ios - 选择 Collection View 中的单元格到新 Controller

objective-c - 如何为UIImage的drawAsPatternInRect指定图像偏移