Ios ARKit:如何在SCNView中为SCNCylinder应用多种颜色的材质?

Ios ARKit:如何在SCNView中为SCNCylinder应用多种颜色的材质?,ios,pie-chart,arkit,scnnode,Ios,Pie Chart,Arkit,Scnnode,我必须使一个SCNCylinder看起来像一个动态饼图,我可以通过添加纹理或应用颜色到SCNCylinder下面的代码使它看起来像一个静态饼图。但是,我的饼图值会随机更改,并希望添加颜色值占圆柱体百分比的材质 var planet : SCNGeometry planet = SCNCylinder(radius: 0.2, height: 0.05) let material = SCNMaterial() material.diffuse.contents =

我必须使一个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)

您不能使用离散材质重新组装
SCNCylinder
的任意部分。SceneKit仅定义了一种将圆柱体分解为具有单独材料的单独部分的方法(来自:

圆柱体包含三个
SCNGEOmeteryElement
对象:一个用于底部和顶部,另一个用于环绕其侧面。SceneKit可以使用不同的材质渲染每个元素。有关详细信息,请参阅
scngometry
中的
materials
属性

这意味着您可以将
planet.materials
设置为三种材质的数组,但SceneKit只能使用它们分别为顶部、底部和侧面着色


那么,如果要创建饼图样式的外观,您有什么办法?OTOH,我可以想出两个或三个方向来调查:

用图像做 您提到您已经尝试过类似的方法-创建一个看起来像饼图的静态图像,并将其指定给圆柱体的(顶部材质?)

没有什么可以阻止您将此技术扩展到非静态饼图。您只需动态创建图像(使用CoreGraphics、UIGraphicsImageRenderer等)

要使您的饼图在3D中看起来正确,您需要创建3个图像-圆柱体顶部的常规饼图,底部的同一饼图的反转版本,以及一个矩形图像,其上下颜色块的相对比例与环绕侧面的饼图片的相对比例相同。可能需要一些实验来找出如何格式化这三幅图像,使它们正确排列

使用自定义几何体执行此操作 如果您想要一个“完全3D”的饼图(如您在页面、数字和注释记号中看到的饼图),其中每个切片都是一个单独的3D对象,可以从饼图中拉出,使其比其他切片更高/更短,等等,则
SCNCylinder
不适合您。它只知道如何画完整的圆柱体

没有任何用于创建楔形体的内置SceneKit类,但是如果您能够自己计算出构建网格的数学,那么您可以使用并在SceneKit中构建该网格

使用
SCNShape
不过,对于此任务来说,自定义几何体可能过于复杂。你要找的形状是一种比较简单的3D几何图形——在三维空间中挤出的2D形状(圆的一个扇形)来创建3D实体(饼的一个楔子、蛋糕的一片,或者你喜欢的任何其他美味的比喻)

在SceneKit中,有一个用于此的应用程序。(呃,一个类。)获取2D并将其拉伸以创建3D对象。你甚至可以用漂亮的小圆边。而且,
UIBezierPath
允许您

因此,要构建饼图:

  • 使用
    init(arcCenter:radius:startAngle:endAngle:顺时针:)
    初始值设定项创建多个
    UIBezierPath
    对象,每个饼图切片一个。对它们使用相同的中心点(零可能很好)

  • 从每个Bézier路径,创建一个具有首选拉伸深度的
    SCNShape
    。如果您希望馅饼的每一片都有不同的风味颜色,请为每个形状指定不同的材质

  • 通过创建一个
    SCNNode
    来保存每个切片,并将这些节点放置在相同的位置,将切片组装成一个饼图。(圆弧的二维原点在三维坐标系中是受尊重的,因此,如果为使用同一中心创建的不同圆弧设置相同的节点位置,它们将在三维中具有相同的中心。)如果希望能够在此之后一起移动整个饼图,请创建另一个
    SCNNode
    ,并将所有切片作为其子对象

  • 该死,现在我饿了