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

问题描述:

我对场景包和3D开发一般都很陌生,我正在玩弄ARKit并尝试将纹理贴合到飞机上(很好,它只是一个scnbox,但只有顶部表面),但我严重失败也没有找到有用的东西在网络上。如何将纹理贴合到表面上? ARKit SceneKit Swift

我有一个很长的矩形PNG图像的道路纹理。 width:height ratio大约是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

尝试使用:

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

也有一些很好的教程可以在此链接上找到