我必须使SCNCylinder看起来像一个动态饼图,我可以通过添加纹理或使用以下代码将颜色应用于SCNCylinder来使其看起来像静态饼图。但是,我的饼图值随机变化,并且想要添加颜色值占据圆柱体百分比部分的材质。
var planet : SCNGeometry
planet = SCNCylinder(radius: 0.2, height: 0.05)
let material = SCNMaterial()
material.diffuse.contents = UIImage(named: "texture.jpg")
//OR to apply single color
material.diffuse.contents = UIColor.red
planet.materials = [material]
let planetNode = SCNNode(geometry: planet)
答案 0 :(得分:3)
您不能使用离散材料重新着色SCNCylinder
的任意部分。 SceneKit只定义了一种将圆柱体分解为具有单独材质的独立部分的方法(来自docs):
一个圆柱包含三个
SCNGeometryElement
个对象:每个对象的底部和顶部各有一个,另一个围绕其两侧。 SceneKit可以使用不同的材质渲染每个元素。有关详细信息,请参阅materials
中的SCNGeometry
属性。
这意味着您可以将planet.materials
设置为三种材质的数组,但SceneKit只能使用它们分别为顶部,底部和侧面着色。
如果你想创建一个饼图样式的外观,你有什么追索权? OTOH,我可以考虑两三个方向进行调查:
你提到你已经尝试过这样的事情 - 创建一个看起来像饼图的静态图像并将其分配给圆柱体的(顶部材料?)。
没有什么能阻止您将此技术扩展到非静态饼图。您只需要动态创建图像(使用CoreGraphics,UIGraphicsImageRenderer等)。
要让你的饼图在3D中看起来正确,你需要创建3个图像 - 圆柱顶部的常规饼图,底部相同饼图的反转版本,以及顶部的矩形图像底部的颜色块与围绕两侧的饼图切片的相对比例相同。可能需要进行一些实验来弄清楚如何格式化这三个图像,使它们排成一行。
如果你想要一个“全3D”饼图(就像你在Pages,Numbers和Keynote中看到的那样),每个切片都是一个单独的3D对象,可以从比其他更高/更短的饼中拉出来切片等,然后SCNCylinder
不适合你。它只知道如何绘制完整的圆柱体。
没有用于创建楔形的任何内置SceneKit类,但是如果你可以自己计算数学来构造网格,你可以使用SCNGeometrySource
和SCNGeometryElement
来构造网格在SceneKit中。
SCNShape
自定义几何体对于此任务可能过度。你正在寻找的那种形状是更简单的3D几何形状之一 - 在第三维中挤出的2D形状(圆形扇形)以创建3D实体(馅饼的楔形,蛋糕切片)或者你喜欢的任何其他美味的比喻。
在SceneKit中,有一个应用程序。 (呃,一个班级。)SCNShape
采用2D UIBezierPath
并将其拉伸以创建一个3D对象。你甚至可以为它涂上漂亮的小圆角。 UIBezierPath
允许您create paths using circle arcs。
所以,建立一个饼图:
使用UIBezierPath
初始值设定项为每个切片创建一个init(arcCenter:radius:startAngle:endAngle:clockwise:)
个对象。对所有这些使用相同的中心点(零可能很好)。
从每个Bézier路径创建一个SCNShape
,其中包含您首选的拉伸深度。如果您希望饼图的每个切片都具有不同的 flavor 颜色,请为每个形状指定不同的材质。
通过创建SCNNode
来保存每个切片并将这些节点放在相同位置,将切片组装成饼图。 (在3D坐标系中,弧的2D原点受到尊重,因此如果为使用相同中心创建的不同弧设置相同的节点位置,它们将在3D中具有相同的中心。)如果您希望能够移动之后整个馅饼一起创建另一个SCNNode
并将所有切片作为其子项。
Dangit,现在我很饿......