【问题标题】:SceneKit Custom Geometry Shape not showing upSceneKit 自定义几何形状未显示
【发布时间】:2019-03-02 20:08:25
【问题描述】:

我对 Swift 和 SceneKit 还是很陌生,我目前的问题是我尝试创建的自定义形状没有显示出来,即使框架中的原始形状显示得很好。

我一直在关注https://www.raywenderlich.com/1261-scene-kit-tutorial-with-swift-part-1-getting-started 的教程。

我还查看了关于 SO:SceneKit – Custom geometry does not show up 的答案。我在这里查看了其他答案,但没有一个对我有用。

这是我的代码:

import UIKit
import SceneKit
import QuartzCore

class GameViewController: UIViewController {
    var scnView: SCNView!
    var scnScene: SCNScene!
    var cameraNode: SCNNode!

    override func viewDidLoad() {
        super.viewDidLoad()
        setupView()
        setupScene()
        setupCamera()
        let lightNode0 = SCNNode()
        lightNode0.light = SCNLight()
        lightNode0.light!.type = .omni
        lightNode0.position = SCNVector3(x: 0, y: 10, z: 10)
        scnScene.rootNode.addChildNode(lightNode0)

        let lightNode1 = SCNNode()
        lightNode1.light = SCNLight()
        lightNode1.light!.type = .omni
        lightNode1.position = SCNVector3(5, -10, 0)
        scnScene.rootNode.addChildNode(lightNode1)
        spawnShape()
    }

    func shouldAutorotate() -> Bool {
        return true
    }

    func prefersStatusBarHidden() -> Bool {
        return true
    }
    func setupView() {
        scnView = self.view as! SCNView
        // 1
        scnView.showsStatistics = true
        // 2
        scnView.allowsCameraControl = true
        // 3
        scnView.autoenablesDefaultLighting = true
    }
    func setupScene() {
        scnScene = SCNScene()
        scnView.scene = scnScene
    }

    func setupCamera() {
        // 1
        cameraNode = SCNNode()
        // 2
        cameraNode.camera = SCNCamera()
        // 3
        cameraNode.position = SCNVector3(x: 0, y: 0, z: 15)
        // 4
        scnScene.rootNode.addChildNode(cameraNode)
    }

这是生成自定义形状的函数:

    func spawnShape() {
        // 1
        var geometry:SCNGeometry
        let positions = [
            SCNVector3(-2, 1.5, 0), //0
            SCNVector3(-2, 1.5, 0), //1
            SCNVector3(2, -1.5, 0), //2
            SCNVector3(2, 1.5, 0), //3
            SCNVector3(-2, 1.5, 0.4), //4
            SCNVector3(2, 1.5, 0.4) //5
        ]
        let source = SCNGeometrySource(vertices: positions)
        let indices:[CInt] = [
            0, 2, 1,
            0, 3, 2,
            0, 4, 5,
            0, 5 ,3,
            4, 1, 2,
            4, 2, 5
            ]
        let element = SCNGeometryElement(indices: indices, primitiveType:.triangles)

        // 4
        geometry = SCNGeometry(sources: [source], elements: [element])
        let geometryNode = SCNNode(geometry: geometry)

        // 5
        scnScene.rootNode.addChildNode(geometryNode)
    }
}

【问题讨论】:

  • 在函数spawnShape()中检查geometryNode的大小如何?恐怕是零。
  • sakiM 如何判断我的 geometryNode 是否为 0?如果几何为空,但几何不为空,情况就是这样
  • 我发现我的对象是黑色的,背景是黑色的,所以我什么都看不到。但是我查看了其他代码和教程并注意到它们不需要更改颜色或计算对象的表面法线以使其看起来不是黑色,我相信该函数会使用顶点输入为您完成。但我仍然想尝试为其添加表面法线,我只是不知道如何。有什么帮助吗?

标签: swift scenekit scngeometry


【解决方案1】:

试试我的轻量级代码(用于快速测试的 macOS 版本)。

它正在工作:

import SceneKit

class GameViewController: NSViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        let scene = SCNScene()
        let cameraNode = SCNNode()
        cameraNode.camera = SCNCamera()
        scene.rootNode.addChildNode(cameraNode)
        cameraNode.position = SCNVector3(x: 0, y: 0, z: 3)

        let geometry: SCNGeometry?
        let positions = [
            SCNVector3(0, 1, 0),
            SCNVector3(-0.5, 0, 0.5),
            SCNVector3(0.5, 0, 0.5),
            SCNVector3(0.5, 0, -0.5),
            SCNVector3(-0.5, 0, -0.5),
            SCNVector3(0, -1, 0),
        ]
        let source = SCNGeometrySource(vertices: positions)
        let indices: [UInt32] = [
            0, 1, 2,
            2, 3, 0,
            3, 4, 0,
            4, 1, 0,
            1, 5, 2,
            2, 5, 3,
            3, 5, 4,
            4, 5, 1
        ]
        let element = SCNGeometryElement(indices: indices, primitiveType:.triangles)
        geometry = SCNGeometry(sources: [source], elements: [element])
        geometry!.firstMaterial?.diffuse.contents = NSColor.red
        let geometryNode = SCNNode(geometry: geometry)
        scene.rootNode.addChildNode(geometryNode)

        let scnView = self.view as! SCNView
        scnView.scene = scene
        scnView.allowsCameraControl = true
        scnView.autoenablesDefaultLighting = true
        scnView.backgroundColor = NSColor.black
    }
}

【讨论】:

    猜你喜欢
    • 2016-04-26
    • 2016-04-01
    • 2016-11-25
    • 2021-08-01
    • 2016-03-12
    • 2019-05-16
    • 2018-03-05
    • 2018-09-10
    • 1970-01-01
    相关资源
    最近更新 更多