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;
Это делается в методе initWithAnchor, который использует ARPlaneAnchor, найденный на плоскости.