Swift:设置SCNMaterial适用于SCNBox,但不适用于从Wings3D DAE加载的SCNGeometry

时间:2014-07-12 07:13:34

标签: uiimage swift scenekit

此代码摘录(场景,相机,灯光等,从代码中删除)在iOS模拟器上的Swift中工作:

    let boxNode = SCNNode()

    // Create a box
    boxNode.geometry = SCNBox(width: 1, height: 1, length: 1, chamferRadius: 0.1)
    let numFaces = 6

    scene.rootNode.addChildNode(boxNode)

    // create and configure a material for each face
    var materials: [SCNMaterial] = Array()

    for i in 1...numFaces
    {
        let material = SCNMaterial()
        material.diffuse.contents = UIImage(named: "texture")
        materials += material
    }

    // set the material to the 3d object geometry
    boxNode.geometry.materials = materials

它生成一个框,每个面都是方格图像。

SCNBox in App

尝试使用在Wings3D中创建的简单库存几何体,保存到DAE,并在应用程序中加载,给我一个合适的形状,但脸上没有阴影和图像:

    let boxNode = SCNNode()

    // Load the geometry
    let urlToColladaFile = NSBundle.mainBundle().URLForResource("Objects", withExtension:"dae")
    let sceneSource = SCNSceneSource(URL:urlToColladaFile, options:nil)

    boxNode.geometry = sceneSource.entryWithIdentifier("dodecahedron3-0", withClass:SCNGeometry.self) as SCNGeometry
    let numFaces = 10

    scene.rootNode.addChildNode(boxNode)

    // create and configure a material for each face
    var materials: [SCNMaterial] = Array()

    for i in 1...numFaces
    {
        let material = SCNMaterial()
        material.diffuse.contents = UIImage(named: "texture")
        materials += material
    }

    // set the material to the 3d object geometry
    boxNode.geometry.materials = materials

Dodecahedron from Wings3D

我错过了什么?

2 个答案:

答案 0 :(得分:6)

几何体是否有纹理坐标? 您可以通过编程方式验证(通过检查是否存在具有SCNGeometrySourceSemanticTexcoord语义的源)或Xcode中内置的SceneKit编辑器。

另请注意,您不必为每个几何元素创建一个材质。 如果它们完全相同,只需构建一个材质的数组,它将用于整个几何体。

答案 1 :(得分:1)

谢谢,mnuages& rickster。你的扣除导致我在Wings3D中研究我的选项,并且我能够在Wings3D中解决问题。

简而言之,我需要为实体的每个面创建一个UV Mapping。

对于普通的多面体,我有多种选择:

  • 选择整个身体(以及所有面部),对其进行单个UV贴图,并使一个图像在所有面上展开。有关于如何执行此操作的在线教程。
  • 对于每个面,选择它,进行UV贴图(我通常选择Projection Normal来做),然后无论你在代码中放入材料数组的图像数量多少,每个面都会得到相同的贴图。
  • 对于每张脸,请先执行以上操作。然后进入“大纲视图”窗口,复制AUV(自动UV)文件,使每个面都有一个唯一的文件。然后选择每个AUV并将其分配给不同的面部。这会给我尽可能多的面孔,例如,允许我为模具的每个面创建一个新图像。我必须弄清楚 - 在设置材料时,Wings3D中的AUV映射似乎与SceneKit称为几何元素的一对一映射。
  • 以上的组合,以便多个面可以共享相同的映射,然后自动分配相同的图像。

如果我开始在边缘添加边框或更光滑的倒角,这一切都变得有点复杂,现在我需要确保UV Mapping对我工作的每组面都有意义。再次,网上有关于此的教程。

再次感谢!

干杯, 亨利