首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Swift:设置SCNMaterial适用于SCNBox,但不适用于从Wings3D DAE加载的SCNGeometry

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

Stack Overflow用户
提问于 2014-07-12 07:13:33
回答 3查看 9.2K关注 0票数 6

此代码摘录(场景、摄像机、光线等从代码中剪切出来)在Swift中在iOS模拟器上工作:

代码语言:javascript
复制
    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

它生成一个盒子,每一张脸都是格子图像。

在Wings3D中创建一个简单的股票几何图形,保存到一个DAE中,然后加载到应用程序中,尝试同样的方法,它给了我一个合适的形状,但是没有阴影和图像出现在脸上:

代码语言:javascript
复制
    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

我遗漏了什么?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-07-15 20:57:03

谢谢,蠢货和蓖麻。您的演绎让我在Wings3D中研究了我的选择,并且我能够在Wings3D中解决问题。

总之,我需要创建一个UV映射每一个表面的固体。

对于正多面体,我有多种选择:

  • 选择整个身体(因此所有的脸),做一个单一的紫外线映射,并有一个图像是伸展到所有的脸。有关于如何做到这一点的在线教程。
  • 对于每个脸,选择它,做一个UV映射(我通常选择普通投影来做),然后每个脸都会得到相同的映射,不管你在我的代码中把多少图像放入材料数组中。
  • 对于每一张脸,先做上面的动作。然后进入外部窗口,复制AUV (自动UV)文件,以便每个脸都有一个唯一的文件。然后选择每个AUV,并将其分配给不同的面孔。这会给我想要的多少张脸,例如,允许我为每一个模具的脸创建一个新的图像。我不得不弄清楚--在Wings3D内部,似乎有一对一的映射,到SceneKit所称的几何元素,在设置材料时。
  • 上面的组合,这样多个人脸可以共享相同的映射,然后自动分配相同的图像。

这一切变得有点复杂,如果我开始增加边框或平滑的倒角,因为现在,我需要确保紫外线映射是有意义的每一组脸,我的工作。同样,网上也有关于这方面的教程。

再次感谢!

干杯,亨利

票数 1
EN

Stack Overflow用户

发布于 2014-07-12 11:10:06

你的几何图形有纹理坐标吗?您可以通过编程(通过检查是否存在具有SCNGeometrySourceSemanticTexcoord语义的源)或在内置于Xcode中的SceneKit编辑器中验证这一点。

还要注意的是,每个几何元素不需要创建一个材料。如果它们都是相同的,只需建立一个材料阵列,它将用于整个几何。

票数 6
EN

Stack Overflow用户

发布于 2016-04-11 06:12:33

首先,当你设计3D物体时,你必须定义材料。

然后以编程方式为每个材料分配纹理。

代码语言:javascript
复制
 let material1 = SCNMaterial()
 material1.diffuse.contents = UIImage(named: "1")?.xFlipped
 material1.locksAmbientWithDiffuse = true

 let material2 = SCNMaterial()
 material2.diffuse.contents = UIImage(named: "2")?.xFlipped
 material2.locksAmbientWithDiffuse = true

 ...

 let material12 = SCNMaterial()
 material12.diffuse.contents = UIImage(named: "12")?.xFlipped
 material12.locksAmbientWithDiffuse = true


 scene.rootNode.childNodeWithName("Dice", recursively: false)?.geometry?.materials = [material1, material2, material3, material4, material5, material6, material7, material8, material9, material10, material11, material12]

其中"Dice“是在属性检查器中设置的对象标识名。

代码语言:javascript
复制
extension UIImage {
    var xFlipped: UIImage {
        let tempImageView = UIImageView(frame: CGRectMake(0, 0, self.size.width, self.size.height))
        tempImageView.image = self
        let viewTempImage = UIView(frame: tempImageView.frame)
        viewTempImage.addSubview(tempImageView)

        tempImageView.transform = CGAffineTransformMakeScale(-1, 1)
        let img = viewTempImage.screenshot

        return img

    }
}


extension UIView {
    var screenshot: UIImage{
        UIGraphicsBeginImageContext(self.bounds.size);
        let context = UIGraphicsGetCurrentContext();
        self.layer.renderInContext(context!)
        let screenShot = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();
        return screenShot
    }
}

注意:在我的案例中,当我添加纹理时,它是水平翻转的。所以我像上面那样手动翻转。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24710609

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档