Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 具有SceneKit线条基本类型的笔划宽度_Ios_Swift_Drawing_Scenekit_Scnnode - Fatal编程技术网

Ios 具有SceneKit线条基本类型的笔划宽度

Ios 具有SceneKit线条基本类型的笔划宽度,ios,swift,drawing,scenekit,scnnode,Ios,Swift,Drawing,Scenekit,Scnnode,我正在尝试使用场景工具包复制此立方体图像形状(获得的许可) 到目前为止,我已经有了线条和顶点的绘图代码。我不能使用图像,因为背景必须是透明的 我现在试图解决的具体问题是如何编辑SCNGeometryPrimitiveType.Line元素的笔划宽度 我创建线条的基本方式如下: private func squareVertices(length: Float) -> [SCNVector3] { let m = length/Float(2) let topLeft =

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

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

我现在试图解决的具体问题是如何编辑
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)
    }
}
private func squareVertices(长度:Float)->[SCInvector3]{
设m=长度/浮动(2)
设topLeft=scinvector3make(-m-q,m+q,m+q)
设topRight=SCInvector3Make(m+q,m+q,m+q)
设bottomLeft=scinvector3make(-m-q,-m-q,m+q)
设bottomRight=scinvector3make(m+q,-m-q,m+q)
返回[左上、右上、左下、右下]
}
private func cubeFace()->scngometry{
让顶点:[SCInvector3]=正方形顶点(l)
让geoSrc=SCNGeometrySource(顶点:非安全指针(顶点),计数:顶点。计数)
//索引缓冲区
让idx1:[Int32]=[0,3]
让data1=NSData(字节:idx1,长度:(sizeof(Int32)*idx1.count))
让geoElements1=SCNGeometryElement(数据:data1,原语类型:SCNGeometryPrimitiveType.Line,原语计数:idx1.count,字节索引:sizeof(Int32))
让idx2:[Int32]=[1,2]
让data2=NSData(字节:idx2,长度:(sizeof(Int32)*idx2.count))
让geoElements2=SCNGeometryElement(数据:data2,原语类型:SCNGeometryPrimitiveType.Line,原语计数:idx2.count,字节索引:sizeof(Int32))
let geo=SCNGeometry(来源:[geoSrc],元素:[geoElements1,geoElements2])
返回地理位置
}
专用函数setupFaceNodes(){
//侧面
对于0中的i..可以使用设置线宽。
确保在项目中包含OpenGLES


以下是您的多维数据集在线宽设置为8时的外观。

SceneKit没有为此提供控件。但是,SceneKit使用OpenGL ES绘制,而OpenGL ES提供了控件

当您在
GL\u LINES
模式下使用GL绘制时,
glLineWidth
调用会更改线宽。(注意:参数以实际像素为单位,而不是以UI布局点为单位,因此如果您不想在视网膜显示器上显示超薄的发际线,则需要比您想象的更大的宽度。)

那么,在你的SceneKit应用程序中,你在哪里调用它呢?你有几个选项。在像你这样的简单场景中,你只渲染一件事,你可以在场景渲染之前设置它。为你的视图设置一个,然后在那里实现并调用
glLineWidth

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

  • 用窄的三角形条做你的“线”
  • 从原始的SCN几何体(如长方体和圆柱体)制作它们

  • 保留简单的立方体几何体,但使用片段着色器(或着色器修改器片段)仅在每个多边形的边缘附近绘制

“保留简单的立方体几何体,但使用片段着色器(或着色器修改器片段)仅在每个多边形的边缘附近绘制”使用片段着色器如何实现这一点?使用着色器绘制线框的问题不是更难解决吗?它可能更复杂,但也允许更大的灵活性,例如模糊/发光边。根据需要,您不需要传递另一个属性(SceneKit中的几何体源)重心坐标系下如果要高亮显示四边形的边,请忘记它实际上是两个三角形,只需查看texcoords(假设您的texcoords设置为跟随四边形)我尝试过这种方法,在委托方法中添加glLineWidth调用,它在模拟器上工作,但对设备没有影响。你们看到过同样的行为吗?奇怪的是,如果我直接使用GLES而不是SceneKit,我可以让glLineWidth在具有相当粗线条的设备上工作。@eddy:SceneKit甚至使用设备上的e GL渲染器?
glLineWidth
对金属不起任何作用(并且没有金属等效物)。glLineWidth也因设备而异。我在iOS上从未使用过它,并将其切换到别处。现在不推荐使用此功能。。。