简体   繁体   中英

SceneKit how to draw a sphere showing mesh like surface instead of smooth?

I am drawing a sphere in Scene Kit, and it all works ok. I am drawing it like so:

   ...
   let g = SCNSphere(radius: radius)
   geometria.firstMaterial?.diffuse.contents = myColor
   let node = SCNNode(geometry: g)
   node.position = SCNVector3(x: x, y: y, z: z)
   scene.rootNode.addChildNode(node)

This draws the sphere with a smooth surface (see image). I would在此处输入图像描述

What I am trying to accomplish is to have the sphere not rendered "smooth" like in the photo but I want to be able to have it so it shows the skeleton... so maybe control how many triangles it uses to draw the surface of the sphere but the triangles need to be empty, so I would just see the sides of the triangles...

Any suggestion?

So here's an image of what zI am trying to make the sphere look like:在此处输入图像描述

  • Your wish #1: "not smooth" sphere
  • Your wish #2: wireframe

Past this into Xcode playground:

import Cocoa
import SceneKit
import QuartzCore
import XCPlayground

// create a scene
var sceneView = SCNView(frame: CGRect(x: 0, y: 0, width: 300, height: 300))
var scene = SCNScene()
sceneView.scene = scene
XCPShowView("The Scene View", sceneView)
sceneView.autoenablesDefaultLighting = false

// create sphere
let g = SCNSphere(radius: 100)
g.firstMaterial?.diffuse.contents = NSColor.greenColor()

// WISH #1    
g.segmentCount = 12

let node = SCNNode(geometry: g)
node.position = SCNVector3(x: 10, y: 10, z: 10)
scene.rootNode.addChildNode(node)

// WISH #2
glPolygonMode(GLenum(GL_FRONT), GLenum(GL_LINE));
glPolygonMode(GLenum(GL_BACK), GLenum(GL_LINE));

// animate
var spin = CABasicAnimation(keyPath: "rotation")
spin.toValue = NSValue(SCNVector4: SCNVector4(x: 1, y: 1, z: 0, w: CGFloat(2.0*M_PI)))
spin.duration = 3
spin.repeatCount = HUGE // for infinity
node.addAnimation(spin, forKey: "spin around")

Taken from the possible duplicate question Render an SCNGeometry as a wireframe , I'm going to copy it here for posterity:

it's possible to set the fillMode of the Material to just lines , which gives the desired effect:

g.firstMaterial?.fillMode = .lines 
// (or possibly geometria.firstMaterial?.fillMode, not clear from your example)

you can then change the 'resolution' of the wireframe using:

g.segmentCount = 12 
// 48 is the default, lower is 'coarser', less than 3 
// is undefined and therefore unsupported

and you can probably also want to set:

g.isGeodesic = true

... which will give you triangular 'tiles' on your wireframe rather than the default rectangles.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM