8

2 つの黄色い三角形が表示されるはずですが、何も表示されません。

class Terrain {

    private class func createGeometry () -> SCNGeometry {

        let sources = [
            SCNGeometrySource(vertices:[
                SCNVector3(x: -1.0, y: -1.0, z:  0.0),
                SCNVector3(x: -1.0, y:  1.0, z:  0.0),
                SCNVector3(x:  1.0, y:  1.0, z:  0.0),
                SCNVector3(x:  1.0, y: -1.0, z:  0.0)], count:4),
            SCNGeometrySource(normals:[
                SCNVector3(x:  0.0, y:  0.0, z: -1.0),
                SCNVector3(x:  0.0, y:  0.0, z: -1.0),
                SCNVector3(x:  0.0, y:  0.0, z: -1.0),
                SCNVector3(x:  0.0, y:  0.0, z: -1.0)], count:4)
        ]

        let elements = [
            SCNGeometryElement(indices: [0, 2, 3, 0, 1, 2], primitiveType: .Triangles)
        ]

        let geo = SCNGeometry(sources:sources, elements:elements)

        let mat = SCNMaterial()
        mat.diffuse.contents = UIColor.yellowColor()
        mat.doubleSided = true
        geo.materials = [mat]

        return geo
    }

    class func createNode () -> SCNNode {

        let node = SCNNode(geometry: createGeometry())
        node.name = "Terrain"
        node.position = SCNVector3()
        return node
    }
}

次のように使用します。

let terrain = Terrain.createNode()
sceneView.scene?.rootNode.addChildNode(terrain)


let camera = SCNCamera()
camera.zFar = 10000
self.camera = SCNNode()
self.camera.camera = camera
self.camera.position = SCNVector3(x: -20, y: 15, z: 30)
let constraint = SCNLookAtConstraint(target: terrain)
constraint.gimbalLockEnabled = true
self.camera.constraints = [constraint]

sceneView.scene?.rootNode.addChildNode(self.camera)

私が見る非カスタムジオメトリを持つ他のノードを取得します。どうしたの?

4

2 に答える 2

7

Hal Mueller は、関連するインデックスが指定された型でなければならないという点で非常に正しいですが、この機能が Swift 言語の最近のバージョンで大幅に変更されたことに注意する必要があります。特に、SCNGeometryElement(indices:, primitiveType:)Swift 4 で完全に機能するようになりCIntました。FixedWidthInteger代わりに、プロトコルに準拠する標準の整数型の 1 つを使用しますInt32。メッシュに含まれる頂点の最大数がわかっている場合は、すべての頂点を網羅できる最小のビット サイズを使用します。

例:

    let vertices = [
        SCNVector3(x: 5, y: 4, z: 0),
        SCNVector3(x: -5 , y: 4, z: 0),
        SCNVector3(x: -5, y: -5, z: 0),
        SCNVector3(x: 5, y: -5, z: 0)
    ]

    let allPrimitives: [Int32] = [0, 1, 2, 0, 2, 3]
    let vertexSource = SCNGeometrySource(vertices: vertices)
    let element = SCNGeometryElement(indices: allPrimitives, primitiveType: .triangles)
    let geometry = SCNGeometry(sources: [vertexSource], elements: [element])

    SCNNode(geometry: geometry)

ここで何が起こっているのですか?

vertices最初に、3 次元空間に記述点の配列を作成します。配列は、それらのallPrimitives頂点がどのようにリンクするかを記述します。各要素は、vertices配列からのインデックスです。三角形を使用しているため、これらは各コーナーに 1 つずつ、3 つのグループで検討する必要があります。簡単にするために、ここでは単純な平らな正方形を作成しました。vertices次に、すべての頂点の元の配列を使用するセマンティック タイプでジオメトリ ソースを作成し、配列を使用してジオメトリ要素を作成しallPrimitives、それらが三角形であることを通知して、3 つにグループ化することを認識します。これらを使用して、SCNGeometryを初期化するオブジェクトを作成できますSCNNode

これについて考える簡単な方法は、頂点ソースはオブジェクト内のすべての頂点をリストするためだけに存在するということです。ジオメトリ要素は、それらの頂点がどのようにリンクされているかを記述するためだけに存在します。これら 2 つのSCNGeometryオブジェクトを組み合わせて、最終的な物理的表現を作成するのは です。

于 2017-09-30T09:39:55.513 に答える