具有贝塞尔曲线路径的 SCNShape
SCNShape with bezier path
我想在 Scenekit 中画一条 3d 线 iOS,我正在尝试用下面的代码画线,
func path() -> UIBezierPath
{
var bPath = UIBezierPath()
bPath.moveToPoint(CGPointMake(0, 0))
bPath.addLineToPoint(CGPointMake(10, 10))
bPath.addLineToPoint(CGPointMake(5, 5))
bPath.closePath()
return bPath
}
下面的代码是加载SCNNode中的行,
let sap = SCNShape()
sap.path = path()
let carbonNode = SCNNode(geometry: sap)
carbonNode.position = SCNVector3Make(0, 0, 15)
scene.rootNode.addChildNode(carbonNode)
但是,我得到黑屏。
尝试更改几何体的材质。您可能在白色背景上有一个白色物体。
编辑:
结果还证明三角形的顶点是共线的。因此,你最终得到一个退化的三角形。
你的路径没有表面积,因为你从 (0,0) 开始,画一条线到 (10, 10),然后画第二条线到 (5,5),它已经在 (0) 之间的线上,0) 和 (10, 10)。然后通过在 (0,0) 绘制另一条线来关闭路径。
改变这三个点中的任何一个都会创建一个具有表面积的路径。
另外,z轴指向屏幕外。这意味着根据相机的位置,您可能会将 carbonNode 放在相机后面。相反,如果您打算将它进一步定位到场景中,您应该使用负 z 值。
这是我为解决该问题而编写的一些代码。
// Material colors
let cyanMaterial = SCNMaterial()
cyanMaterial.diffuse.contents = UIColor.cyanColor()
let anOrangeMaterial = SCNMaterial()
anOrangeMaterial.diffuse.contents = UIColor.orangeColor()
let aPurpleMaterial = SCNMaterial()
aPurpleMaterial.diffuse.contents = UIColor.purpleColor()
// A bezier path
let bezierPath = UIBezierPath()
bezierPath.moveToPoint(CGPointMake(-0.25, 0))
bezierPath.addLineToPoint(CGPointMake(0, -0.25))
bezierPath.addLineToPoint(CGPointMake(0.25, 0))
bezierPath.addLineToPoint(CGPointMake(0, 0.25))
bezierPath.closePath()
// Add shape
let shape = SCNShape(path: bezierPath, extrusionDepth: 0.75)
shape.materials = [cyanMaterial, anOrangeMaterial, aPurpleMaterial]
let shapeNode = SCNNode(geometry: shape)
shapeNode.position = SCNVector3(x: 0.2, y: 0.75, z: 0.1);
self.rootNode.addChildNode(shapeNode)
shapeNode.rotation = SCNVector4(x: -1.0, y: -1.0, z: 0.0, w: 0.0)
请记住,Scene Kit 比例的数字以米为单位。因此,将数字设置为与适用于您创建的其他形状的数字类似。
我想在 Scenekit 中画一条 3d 线 iOS,我正在尝试用下面的代码画线,
func path() -> UIBezierPath
{
var bPath = UIBezierPath()
bPath.moveToPoint(CGPointMake(0, 0))
bPath.addLineToPoint(CGPointMake(10, 10))
bPath.addLineToPoint(CGPointMake(5, 5))
bPath.closePath()
return bPath
}
下面的代码是加载SCNNode中的行,
let sap = SCNShape()
sap.path = path()
let carbonNode = SCNNode(geometry: sap)
carbonNode.position = SCNVector3Make(0, 0, 15)
scene.rootNode.addChildNode(carbonNode)
但是,我得到黑屏。
尝试更改几何体的材质。您可能在白色背景上有一个白色物体。
编辑: 结果还证明三角形的顶点是共线的。因此,你最终得到一个退化的三角形。
你的路径没有表面积,因为你从 (0,0) 开始,画一条线到 (10, 10),然后画第二条线到 (5,5),它已经在 (0) 之间的线上,0) 和 (10, 10)。然后通过在 (0,0) 绘制另一条线来关闭路径。
改变这三个点中的任何一个都会创建一个具有表面积的路径。
另外,z轴指向屏幕外。这意味着根据相机的位置,您可能会将 carbonNode 放在相机后面。相反,如果您打算将它进一步定位到场景中,您应该使用负 z 值。
这是我为解决该问题而编写的一些代码。
// Material colors
let cyanMaterial = SCNMaterial()
cyanMaterial.diffuse.contents = UIColor.cyanColor()
let anOrangeMaterial = SCNMaterial()
anOrangeMaterial.diffuse.contents = UIColor.orangeColor()
let aPurpleMaterial = SCNMaterial()
aPurpleMaterial.diffuse.contents = UIColor.purpleColor()
// A bezier path
let bezierPath = UIBezierPath()
bezierPath.moveToPoint(CGPointMake(-0.25, 0))
bezierPath.addLineToPoint(CGPointMake(0, -0.25))
bezierPath.addLineToPoint(CGPointMake(0.25, 0))
bezierPath.addLineToPoint(CGPointMake(0, 0.25))
bezierPath.closePath()
// Add shape
let shape = SCNShape(path: bezierPath, extrusionDepth: 0.75)
shape.materials = [cyanMaterial, anOrangeMaterial, aPurpleMaterial]
let shapeNode = SCNNode(geometry: shape)
shapeNode.position = SCNVector3(x: 0.2, y: 0.75, z: 0.1);
self.rootNode.addChildNode(shapeNode)
shapeNode.rotation = SCNVector4(x: -1.0, y: -1.0, z: 0.0, w: 0.0)
请记住,Scene Kit 比例的数字以米为单位。因此,将数字设置为与适用于您创建的其他形状的数字类似。