SCNGeometry 自定义形状出现黑色

Posted

技术标签:

【中文标题】SCNGeometry 自定义形状出现黑色【英文标题】:SCNGeometry custom shape appear black 【发布时间】:2019-03-03 23:55:51 【问题描述】:

我正在尝试在 SceneKit 中创建自定义几何形状,结果我的形状很好。唯一的问题是它是黑色的,即使我改变了颜色,它仍然是黑色的。我用 SceneKit 中的其他原始形状进行了测试,结果它们很正常。我以为我必须计算表面法线,但根据其他教程和在线代码示例,除非我希望我的形状以某种方式确定,否则我不必计算表面法线,框架会默认为我。我不知道为什么我的形状是黑色的,我在这里查看了不同的主题,但找不到适合我的答案。我对 SceneKit 和 Swift 很陌生。这是我的代码:

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()
        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
        scnView.backgroundColor = UIColor.white
    

    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(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)
        // 4
        geometry = SCNGeometry(sources: [source], elements: [element])
        geometry.firstMaterial?.diffuse.contents = UIColor.white
        let geometryNode = SCNNode(geometry: geometry)
        // 5
        scnScene.rootNode.addChildNode(geometryNode)
    

如果有人能帮助我理解,不胜感激。谢谢

【问题讨论】:

我玩过这个并且能够使用这个链接将颜色变为绿色。从那里我不确定它是如何工作的,但也许这会给你指明正确的方向:***.com/questions/32821653/scenekit-per-vertex-color 【参考方案1】:

添加

    geometry.firstMaterial?.lightingModel = .constant 

改变了我。

【讨论】:

以上是关于SCNGeometry 自定义形状出现黑色的主要内容,如果未能解决你的问题,请参考以下文章

自定义 SCNGeometry 节点上基于物理的照明

形状编辑器 - 刻板印象 - png 格式 - 黑色背景

通过自定义形状裁剪 UIImage

iOS开发之SceneKit框架--SCNGeometry.h

自定义形状的动态数据

通过自定义 LSTM 时的形状错误