2016-07-07 136 views
0

我有一个3D对象(SCNPlane)我想将这个平面分成正方形。想法是将飞机划分成瓦片,每个瓦片都有自己的纹理(纹理坐标)。并且瓦片的数量由用户界面控制。以编程方式生成顶点

enter image description here

在上述图像平面被分成沿x轴3瓷砖和沿y轴的3瓷砖和每个区块被进一步分成两个三角形。现在我正在尝试使用for循环来生成这些顶点。我对这个金属/ opengl世界是陌生的,如果任何人都能指出我的方向是正确的,那将是非常棒的。

感谢

回答

1

这只是数学...

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) 
     } 
    } 
+0

感谢。这就是我所做的,你我更清洁。这是唯一的方法,或者像金属或OpenGLES这样的图形工具包中有可用的api,它们实际上将平面划分为顶点并返回顶点 – krishnan

1

SCNPlanewidthSegmentCountheightSegmentCount性质做到这一点(见SCNPlane Reference)。

编辑 如果您需要自定义纹理坐标,那么你就必须建立使用SCNGeometry.init(sources:elements:)定制的几何形状和计算顶点位置自己。

注意,在斯威夫特你有得心应手

SCNGeometryElement.init(indices:primitiveType:) 

和iOS的10,10 tvOS,MACOS 10.12和watchOS 3以下便利初始化:

SCNGeometrySource.init(normals:) 
SCNGeometrySource.init(textureCoordinates:) 
SCNGeometrySource.init(vertices:) 
+0

,谢谢mnuages,但它不返回顶点。我必须将纹理坐标添加到顶点。 – krishnan

+0

再次感谢。没有看到你的编辑。多数民众赞成什么我结束了做SCNGeometry(来源:[vertexSource,textureSource],元素:[geometryElement]) – krishnan