2017-08-14 78 views
0

我有一個自定義幾何四邊形和我的紋理圖像顯示在它上面,但我希望它顯示爲一個方面填充,而不是拉伸或壓縮以適應空間。SCNMaterial防止伸展

我將相同的紋理應用於一個房間中的多個牆壁,所以如果圖像是壁紙,它必須看起來正確。

有沒有辦法使用以下內容並確定它是如何填充的?

quadNode.geometry?.firstMaterial?.diffuse.contents = UIImage(named: "wallpaper3.jpg") 

感謝

[更新]

let quadNode = SCNNode(geometry: quad) 

let (min, max) = quadNode.boundingBox 

let width = CGFloat(max.x - min.x) 
let height = CGFloat(max.y - min.y) 

let material = SCNMaterial() 
material.diffuse.contents = UIImage(named: "wallpaper3.jpg") 
material.diffuse.contentsTransform = SCNMatrix4MakeScale(Float(width), Float(height), 1) 
material.diffuse.wrapS = SCNWrapMode.repeat 
material.diffuse.wrapT = SCNWrapMode.repeat 

quadNode.geometry?.firstMaterial = material 

回答

1

我想這可能會幫助你,這是客觀的C,但它應該是可以理解的:

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

    SCNMaterial *material = self.planeGeometry.materials[4]; 
    material.diffuse.contentsTransform = SCNMatrix4MakeScale(width, height, 1); 
    material.diffuse.wrapS = SCNWrapModeRepeat; 
    material.diffuse.wrapT = SCNWrapModeRepeat; 

平面幾何是定義如下:

self.planeGeometry = [SCNBox boxWithWidth:width height:planeHeight length:length chamferRadius:0]; 
//planeHeight = 0.01; 

我用這個來顯示水平面,它構成的材料不會伸展,而只是延伸。希望這就是你需要的。

平面的尺寸被定義爲:(櫃面它是需要的)

float width = anchor.extent.x; 
float length = anchor.extent.z; 

這在其使用ARPlaneAnchor在一個平面上發現initWithAnchor方法正在完成。

+0

非常感謝艾倫,我會轉換爲Swift,看看它如何。 –

+0

沒問題Marc,我在一些代碼中加入了一些代碼,這些代碼更多地解釋了變量。 –

+0

我已根據您的上述新代碼更新了原始問題。你能看到有什麼不對嗎?現在正在壓縮設計,而不是將其展示爲一個方面的填充。 應該提到,這是在ARKit中生成的,寬度是0.06和高度2.0,所以它是一個相當短而高的牆。壁紙圖片是1200x800,但我嘗試了其他大小不同的其他人。 乾杯 –