Konturstärke mit SceneKit Linie primitiver Typ
Ich versuche zu replizieren, das cube-Bild-Form (mit freundlicher Genehmigung aus dem original Ersteller) mit Szene-kit.
So weit, ich habe die Zeichnung code für die Linien und die Eckpunkte. Ich kann ein Bild, da der hintergrund transparent sein muss.
Den spezifischen, den ich versuche zu lösen, ist im Moment so ändern Sie die Strichbreite für die SCNGeometryPrimitiveType.Line
element.
Die grundlegende Art und Weise erstelle ich Zeilen wie diese:
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)
}
}
Habe ich etwas, das aussieht wie diese mit der richtigen Form:
aber ich kann nicht herausfinden, wie man erhöhen Sie die Breite der Linien, die gezeichnet wird mit SceneKit. Wie kann ich das erreichen?
Für Interessenten, hier ist ein Beispiel proj.
Du musst angemeldet sein, um einen Kommentar abzugeben.
SceneKit nicht eine Steuerung für diese. Jedoch, SceneKit zieht mit OpenGL ES, die nicht.
Beim zeichnen mit GL in der
GL_LINES
- Modus, derglLineWidth
Aufruf ändert die Linienbreite. (Watch out: das argument ist in der tatsächlichen Pixel, die nicht UI-layout Punkte, also brauchst du eine größere Breite, als Sie vielleicht denken, wenn Sie nicht möchten, dass super-dünne Haarlinien auf ein Retina-display.)Also, wo tun, Sie nennen das in Ihrem SceneKit-app? Sie haben ein paar Optionen gibt es. In einer einfachen Szene, wie der Eure, wo sind Sie nur die rendering eine Sache, können Sie einfach legen Sie es, bevor Sie die Szene Rendern. Legen Sie eine delegieren für Ihre anzeigen, dann implementieren
renderer:willRenderSceneAtTime:
und rufenglLineWidth
es.Jedoch, OpenGL line rendering ist sehr begrenzt — wenn Sie anpassen möchten, Rendern Sie mehr, müssen Sie einen anderen Ansatz. Nur, welcher Ansatz am besten funktioniert, hängt davon ab, genau das, was Sie für gehen, also hier sind ein paar Ideen für Sie, um Forschung:
glLineWidth
tut nichts für Metal (und es gibt keine Metall-äquivalent).[[SCNView alloc] initWithFrame:CGRectZero options:@{SCNViewOptionPreferredRenderingAPI:@(SCNRenderingAPIOpenGLES2)}];
Können Sie glLineWidth zum einstellen der Linienbreite.
Stellen Sie sicher, dass OpenGLES in Ihrem Projekt.
Hier erfahren Sie, wie Ihre Würfel so aussieht wie mit line-Breite auf 8 eingestellt.