gpt4 book ai didi

ios - 以多边形为原始类型的 SCNGeometry

转载 作者:搜寻专家 更新时间:2023-10-31 08:24:50 25 4
gpt4 key购买 nike

试图弄清楚我如何创建一个多边形作为原始类型的 SCNGeometry,我的目标是添加多边形节点作为球体节点的子节点,并使其看起来像 map 套件的 MKPolygon,like in this example .

MKPolygon

我当前的代码是:

//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 时,我得到一个空节点。

最佳答案

你有两个问题:

  1. SceneKit(和 Metal)仅支持 32 位整数作为索引 ( source )。因此,您的索引数组的类型需要是 [Int32]

  2. SceneKit 需要两条多边形信息:多边形中的点数和顶点数组中点的索引。来自 Apple 关于 SCNGeometryPrimitiveTypePolygon 的文档(仅存在于 Objective-C 中):

The element’s data property holds two sequences of values.

  • The first sequence has a number of values equal to the geometry element’s primitiveCount value. Each value in this sequence specifies the number of vertices in a polygon primitive. For example, if the first sequence is [5, 3], the geometry element contains a pentagon followed by a triangle.
  • The rest of the data is a sequence of vertex indices. Each entry in the first sequence specifies a corresponding number of entries in the second sequence. For example, if the first sequence includes the values [5, 3], the second sequence includes five indices for the pentagon, followed by three indices for the triangle.

您需要将索引数组更改为:

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(我们要绘制一个多边形)并更改缓冲区的大小:

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)

关于ios - 以多边形为原始类型的 SCNGeometry,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44922164/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com