首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >多边形为SCNGeometry的primitiveType

多边形为SCNGeometry的primitiveType
EN

Stack Overflow用户
提问于 2017-07-05 09:25:29
回答 1查看 3K关注 0票数 6

为了弄清楚如何创建以多边形为SCNGeometry的primitiveType,我的目标是将多边形形状的节点添加为球体节点的子节点,并使其看起来像地图工具包如本例所示的MKPolygon。

我目前的代码是:

代码语言:javascript
复制
//Take an arbitrary array of vectors
let vertices: [SCNVector3] = [
SCNVector3Make(-0.1304485, 0.551937, 0.8236193),
SCNVector3Make(0.01393811, 0.601815, 0.7985139),
SCNVector3Make(0.2971005, 0.5591929, 0.7739732),
SCNVector3Make(0.4516893, 0.5150381, 0.7285002),
SCNVector3Make(0.4629132, 0.4383712, 0.7704169),
SCNVector3Make(0.1333823, 0.5224985, 0.8421428),
SCNVector3Make(-0.1684743, 0.4694716, 0.8667254)]

//Does polygon shape require indices?
let indices: [Int] = [0,1,2,3,4,5,6]

let vertexSource = SCNGeometrySource(vertices: vertices)
let indexData = Data(bytes: indices, count: indices.count * MemoryLayout<Int>.size)

//Note!!! I get compiler error if primitiveCount is greater than 0
let element = SCNGeometryElement(data: indexData, primitiveType: .polygon, primitiveCount: 0, bytesPerIndex: MemoryLayout<Int>.size)
let geometry = SCNGeometry(sources: [vertexSource], elements: [element])

let material = SCNMaterial()
material.diffuse.contents = UIColor.purple.withAlphaComponent(0.75)
material.isDoubleSided = true
geometry.firstMaterial = material

let node = SCNNode(geometry: geometry)

像这样使用SCNGeometryElement时,我会得到一个空节点。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-07-05 10:30:26

你有两个问题:

  1. SceneKit (和金属)只支持32位整数作为索引(来源)。所以索引数组的类型需要是[Int32]
  2. SceneKit需要两条多边形信息:多边形中的点数和顶点数组中点的索引。来自苹果关于SCNGeometryPrimitiveTypePolygon的文档(只存在于Objective中):

元素的数据属性包含两个值序列。

  • 第一个序列的值等于几何元素的primitiveCount值。此序列中的每个值指定多边形基元中的顶点数。例如,如果第一个序列是5,3,则几何元素包含一个五边形,后面跟着一个三角形。
  • 其余的数据是一个顶点索引序列。第一序列中的每个条目指定第二序列中相应的条目数。例如,如果第一个序列包含值5、3,则第二个序列包含五个五边形指数,然后是三角形的三个指数。

需要将索引数组更改为:

代码语言:javascript
复制
let indices: [Int32] = [7, /* We have a polygon with seven points */,
                        0,1,2,3,4,5,6 /* The seven indices for our polygon */
                       ]

然后,将primitiveCount设置为1(我们有一个要绘制的多边形),并更改缓冲区的大小:

代码语言:javascript
复制
let indexData = Data(bytes: indices, 
                     count: indices.count * MemoryLayout<Int32>.size)

// Now without runtime error
let element = SCNGeometryElement(data: indexData, 
                                 primitiveType: .polygon,
                                 primitiveCount: 1, 
                                 bytesPerIndex: MemoryLayout<Int32>.size)
票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44922164

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档