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

标签 swift scenekit arkit

我对 scenekit 和 3d 开发非常陌生,我正在使用 ARKit 并尝试将纹理安装到平面上(实际上是一个 scnbox,但只是顶部表面),但我严重失败了,而且未能在网络上找到任何有用的内容。

我有一个道路纹理,它是一个非常长的矩形 png 图像。宽高比约为20:1

一旦 arkit 为我找到了平面,我想将这个纹理应用到 table 的表面。在应用程序启动之前我不知道 table 的尺寸。

我目前可以将纹理应用到该平面,还可以根据需要旋转纹理。

我想要完成的是拉伸(stretch)纹理(保持原始比例),使平面和纹理的短边对齐,然后纹理继续直到平面的末端,根据不同的情况切断或重复平面的长度或比率。

这里是获取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

最佳答案

尝试使用:

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

这将有助于 Material 不拉伸(stretch),而只是不断向自身添加越来越多的相同 png。

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

    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

关于swift - 如何将纹理贴合到表面? ARKit SceneKit Swift,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46080900/

相关文章:

ios - SceneKit - 如何使用 Xcode 编辑器将粒子发射器附加到场景中的节点?

ios - 如何更改 SCNShape 的大小?

ios - 如何将自定义参数传递给 SKView 委托(delegate)方法 view(nodeFor)

Swift 标签不适合文本

ios - 使用 Swift 在 Firebase 中让用户保持最新状态

ios - UIView 的渐变层不符合约束集

ios - 如何通过 touchesMoved 方法获取用于在场景 View 上绘制 UIBezierpath 的准确 CGpoint?

ios - 找到哪个按钮导致了 segue 操作?

ios - 当节点下面的节点被删除时,节点不会移动

ios - 如何根据用户位置重新调整 SKNodes