场景在SceneKit中无法正确渲染

时间:2015-10-06 12:10:22

标签: ios swift scenekit

我在场景中创建了一个地板,并将一个collada文件(.dae)加载到我的场景中,并尝试在该模型下创建一个平面。但我有下面的问题。

enter image description here

仅在使用自定义相机时才会生成此问题。使用系统摄像头时,如果没有添加自定义摄像头,场景会正确渲染 我的代码如下:

import UIKit import SceneKit

class TestVC: UIViewController, SCNSceneRendererDelegate {

var cameraNode: SCNNode!
var modelNode: SCNNode!
var scnView: SCNView!
var camNode: SCNNode!

var cameraPosition: SCNVector3!

override func viewDidLoad() {
    super.viewDidLoad()

    scnView = SCNView(frame: self.view.frame)
    scnView.delegate = self
    view.addSubview(scnView)
    scnView.delegate = self

    let scene = SCNScene()
    scnView.scene = scene

    //camera
    let camera = SCNCamera()
    cameraNode = SCNNode()
    cameraNode.camera = camera
    camera.zFar = 1000
    cameraPosition = SCNVector3(0, 100, 150)
    cameraNode.position = cameraPosition
    scene.rootNode.addChildNode(cameraNode)

    //floor
    let floor = SCNFloor()
    floor.reflectivity = 0
    let floorNode = SCNNode(geometry: floor)
    let firstmaterial = SCNMaterial()
    firstmaterial.diffuse.contents = UIImage(named: "art.scnassets/grass.jpg")
    firstmaterial.diffuse.wrapS = SCNWrapMode.Repeat
    firstmaterial.diffuse.wrapT = SCNWrapMode.Repeat
    floor.materials = [firstmaterial]
    scene.rootNode.addChildNode(floorNode)

    let light = SCNLight()
    let lightNode = SCNNode()
    lightNode.light = light
    light.type = SCNLightTypeAmbient
    light.color = UIColor.darkGrayColor()
    scene.rootNode.addChildNode(lightNode)

    let light1 = SCNLight()
    let light1Node = SCNNode()
    light1Node.light = light1
    light1Node.position = SCNVector3(0, 200, -100)
    light1.type = SCNLightTypeOmni
    scene.rootNode.addChildNode(light1Node)

    let modelScene = SCNScene(named: "Barcelona Chair.dae")
    let solNode = modelScene?.rootNode
    solNode?.eulerAngles = SCNVector3(GLKMathDegreesToRadians(-90), 0, 0)
    scene.rootNode.addChildNode(solNode!)
    scnView.allowsCameraControl = true

    let plane = SCNPlane(width: 100, height: 100)
    let planeNode = SCNNode(geometry: plane)
    planeNode.pivot = SCNMatrix4MakeRotation(Float(M_PI_2), 1, 0, 0)//(CGFloat(M_PI_2), 1, 0, 0)
    planeNode.position = SCNVector3(0, 1, 0)
    plane.firstMaterial?.diffuse.contents = UIColor.redColor()
    scene.rootNode.addChildNode(planeNode)

}

2 个答案:

答案 0 :(得分:1)

您可能会看到的是" z-fighting"。基本上,你的地板和你的飞机是共存的 - 它们是共面的 - 所以它们的渲染是模糊的。尝试通过将飞机的位置设置得高于地板平面,将飞机抬高一点,你应该看到这个问题消失了。

答案 1 :(得分:0)

不知道为什么存在上述问题,但我有不同的做法。您可以使用SCNShape在地板上绘制叠加层。我使用UIBezierPath绘制了一个矩形路径,并设置了SCNShape类的path属性。 :)