如何将纹理贴合到表面? ARKit SceneKit Swift

时间:2017-09-06 17:10:44

标签: swift scenekit arkit

我对scenekit和3d开发很新,我正在玩ARKit并试图将纹理贴合到一个平面上(实际上是一个scnbox但只有顶面)但是我严重失败了没有在网上找到任何有用的东西。

我的道路纹理是一个很长的矩形png图像。宽度:高度比约为20:1

一旦arkit为我找到了飞机,我想将这个纹理应用到表面。在应用开始之前,我不知道桌子的尺寸。

我当前可以将纹理应用于此平面,并根据需要旋转纹理。

我想要完成的是拉伸纹理(保持原始比例),使平面和纹理的短边对齐,然后纹理继续直到平面的末端,切断或重复取决于飞机的长度或比例。

以下是获取ScnMaterial对象的函数

class func getRunwayMaterial() -> SCNMaterial {
    let name = "runway"
    var mat = materials[name]
    if let mat = mat {
        return mat
    }
    mat = SCNMaterial()
    mat!.lightingModel = SCNMaterial.LightingModel.physicallyBased
    mat!.diffuse.contents = UIImage(named: "./Assets.scnassets/Materials/runway/runway.png")
    mat!.diffuse.wrapS = SCNWrapMode.repeat
    mat!.diffuse.wrapT = SCNWrapMode.repeat
    materials[name] = mat
    return mat!
}

这是应该在平面上进行缩放和旋转纹理的功能。

func setRunwayTextureScale(rotation: Float? = nil, material: SCNMaterial? = nil) {
    let texture = material != nil ? material! : planeGeometry.materials[4]
    var m: SCNMatrix4 = SCNMatrix4MakeScale(1, 1, 1)
    if(rotation != nil){
        textureRotation = rotation! + textureRotation
    }
    m = SCNMatrix4Rotate(m, textureRotation, 0, 1, 0)
    texture.diffuse.contentsTransform = m
}

请帮我填写这里的空白,如果有人有关于如何进行此类操作的任何链接或文章,请链接我!

谢谢! 乙

编辑:顺便说一句我正在使用xcode 9

1 个答案:

答案 0 :(得分:2)

尝试使用:

material.diffuse.wrapS = SCNWrapModeRepeat;
material.diffuse.wrapT = SCNWrapModeRepeat;

这有助于材料不会拉伸,而只是不断添加越来越多的相同png。

您还可以通过将材质设置为宽度和高度来设置材质的比例:

    CGFloat width = self.planeGeometry.width;
    CGFloat height = self.planeGeometry.length;

    material.diffuse.contentsTransform = SCNMatrix4MakeScale(width, height, 1);

很抱歉,我在这里使用Objective C,但翻译它应该非常简单。

此链接还可以找到一些好的教程:

https://blog.markdaws.net/apple-arkit-by-example-ef1c8578fb59