2017-09-06 38 views
2

我對場景包和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

回答

0

嘗試使用:

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

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