以编程方式生成顶点
Generating vertices programmatically
我有一个 3D 对象 (SCNPlane
) 我想把这个平面分成正方形。想法是将平面划分为瓦片,每个瓦片都有自己的纹理(纹理坐标)。瓷砖的数量由用户界面控制。
在上图中,平面沿 x 轴分为 3 个瓦片,沿 y 轴分为 3 个瓦片,每个瓦片进一步分为两个三角形。现在我正在尝试使用 for 循环来生成这些顶点。我是这个 metal/opengl 世界的新手,如果有人能指出我正确的方向,那就太好了。
谢谢
这只是数学...
var x0 = 0, x1 = 1000
var y0 = 0, y1 = 1000
var ySplit = 4
var xSplit = 6
for y in (0..<ySplit).reverse() {
var localY0 = y * ((y1 - y0) / ySplit)
var localY1 = (y+1) * ((y1 - y0) / ySplit)
for x in 0..<xSplit {
var localX0 = x * ((x1 - x0) / xSplit)
var localX1 = (x+1) * ((x1 - x0) / xSplit)
//Now you can easily get any vertex/square/triangle set from the given (x0,y) (x1,y1)
}
}
SCNPlane
具有 widthSegmentCount
和 heightSegmentCount
属性(请参阅 SCNPlane Reference)。
编辑
如果您需要自定义纹理坐标,则必须使用 SCNGeometry.init(sources:elements:)
构建自定义几何体并自己计算顶点位置。
请注意,在 Swift 中,您可以方便地使用
SCNGeometryElement.init(indices:primitiveType:)
以及 iOS 10、tvOS 10、macOS 10.12 和 watchOS 3 中的以下便利初始值设定项:
SCNGeometrySource.init(normals:)
SCNGeometrySource.init(textureCoordinates:)
SCNGeometrySource.init(vertices:)
我有一个 3D 对象 (SCNPlane
) 我想把这个平面分成正方形。想法是将平面划分为瓦片,每个瓦片都有自己的纹理(纹理坐标)。瓷砖的数量由用户界面控制。
在上图中,平面沿 x 轴分为 3 个瓦片,沿 y 轴分为 3 个瓦片,每个瓦片进一步分为两个三角形。现在我正在尝试使用 for 循环来生成这些顶点。我是这个 metal/opengl 世界的新手,如果有人能指出我正确的方向,那就太好了。
谢谢
这只是数学...
var x0 = 0, x1 = 1000
var y0 = 0, y1 = 1000
var ySplit = 4
var xSplit = 6
for y in (0..<ySplit).reverse() {
var localY0 = y * ((y1 - y0) / ySplit)
var localY1 = (y+1) * ((y1 - y0) / ySplit)
for x in 0..<xSplit {
var localX0 = x * ((x1 - x0) / xSplit)
var localX1 = (x+1) * ((x1 - x0) / xSplit)
//Now you can easily get any vertex/square/triangle set from the given (x0,y) (x1,y1)
}
}
SCNPlane
具有 widthSegmentCount
和 heightSegmentCount
属性(请参阅 SCNPlane Reference)。
编辑
如果您需要自定义纹理坐标,则必须使用 SCNGeometry.init(sources:elements:)
构建自定义几何体并自己计算顶点位置。
请注意,在 Swift 中,您可以方便地使用
SCNGeometryElement.init(indices:primitiveType:)
以及 iOS 10、tvOS 10、macOS 10.12 和 watchOS 3 中的以下便利初始值设定项:
SCNGeometrySource.init(normals:)
SCNGeometrySource.init(textureCoordinates:)
SCNGeometrySource.init(vertices:)