我对 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/