我想使用SceneKit在球体表面添加形状。我从一个简单的例子开始,只是试图将球体表面的一部分着色为另一种颜色。我希望这是一个可以被点击、选择等操作的对象,所以我的想法是使用自定义的SCNShape对象作为几何体来添加SCNNodes形状。
现在我有一个蓝色的正方形,我正在从一系列点绘制它,并将其添加到包含红色球体的场景中。它基本上与球体上的一个点相切,但真正的目标是在表面上绘制它。SceneKit中是否有任何可以让我做到这一点的方法?我需要进行一些数学/几何计算,使它与球体的形状相同或映射到球体的坐标吗?我正在尝试做的事情是否超出了SceneKit的范围?
如果这个问题太过宽泛,我会很高兴,如果有人能指向一些书籍或资源来学习我所缺少的知识。我完全是新手,对SceneKit和3D一窍不通,只是玩弄一些想法而已。
以下是我现在拥有的一些playground代码:
现在我有一个蓝色的正方形,我正在从一系列点绘制它,并将其添加到包含红色球体的场景中。它基本上与球体上的一个点相切,但真正的目标是在表面上绘制它。SceneKit中是否有任何可以让我做到这一点的方法?我需要进行一些数学/几何计算,使它与球体的形状相同或映射到球体的坐标吗?我正在尝试做的事情是否超出了SceneKit的范围?
如果这个问题太过宽泛,我会很高兴,如果有人能指向一些书籍或资源来学习我所缺少的知识。我完全是新手,对SceneKit和3D一窍不通,只是玩弄一些想法而已。
以下是我现在拥有的一些playground代码:
import UIKit
import SceneKit
import XCPlayground
class SceneViewController: UIViewController {
let sceneView = SCNView()
private lazy var sphere: SCNSphere = {
let sphere = SCNSphere(radius: 100.0)
sphere.materials = [self.surfaceMaterial]
return sphere
}()
private lazy var testScene: SCNScene = {
let scene = SCNScene()
let sphereNode: SCNNode = SCNNode(geometry: self.sphere)
sphereNode.addChildNode(self.blueChildNode)
scene.rootNode.addChildNode(sphereNode)
//scene.rootNode.addChildNode(self.blueChildNode)
return scene
}()
private lazy var surfaceMaterial: SCNMaterial = {
let material = SCNMaterial()
material.diffuse.contents = UIColor.redColor()
material.specular.contents = UIColor(white: 0.6, alpha: 1.0)
material.shininess = 0.3
return material
}()
private lazy var blueChildNode: SCNNode = {
let node: SCNNode = SCNNode(geometry: self.blueGeometry)
node.position = SCNVector3(0, 0, 100)
return node
}()
private lazy var blueGeometry: SCNShape = {
let points: [CGPoint] = [
CGPointMake(0, 0),
CGPointMake(50, 0),
CGPointMake(50, 50),
CGPointMake(0, 50),
CGPointMake(0, 0)]
var pathRef: CGMutablePathRef = CGPathCreateMutable()
CGPathAddLines(pathRef, nil, points, points.count)
let bezierPath: UIBezierPath = UIBezierPath(CGPath: pathRef)
let shape = SCNShape(path: bezierPath, extrusionDepth: 1)
shape.materials = [self.blueNodeMaterial]
return shape
}()
private lazy var blueNodeMaterial: SCNMaterial = {
let material = SCNMaterial()
material.diffuse.contents = UIColor.blueColor()
return material
}()
override func viewDidLoad() {
super.viewDidLoad()
sceneView.frame = self.view.bounds
sceneView.backgroundColor = UIColor.blackColor()
self.view.addSubview(sceneView)
sceneView.autoenablesDefaultLighting = true
sceneView.allowsCameraControl = true
sceneView.scene = testScene
}
}
XCPShowView("SceneKit", view: SceneViewController().view)