material 上的 SceneKit 纹理映射问题

SceneKit texture mapping issue on material

我正在尝试使用 SceneKit 绘制一组简单的 4 个盒子,这些盒子彼此相邻,每个盒子都应用了纹理(Minecraft 风格):

纹理是这样的(png文件):

我想避免盒子之间的小蓝线(不在纹理中),但无论我尝试什么设置,这些人工制品都会保留。

知道如何避免它们吗?

在 scenekit 编辑器中 material 的设置下方(每个盒子完全相同,除了引用正确纹理文件的漫反射部分)

scenekit 编辑器中的问题也出现在设备上的应用 运行 中。

奇怪的是,如果我只是做一个全黑(或任何颜色)纹理(里面有或没有任何东西),这些人工制品不会出现,示例如下:

您似乎需要以编程方式设置每个 material 属性 的换行模式以避免这种 "wrap-around" 行为。配置每个已分配纹理的 material 属性,使其 wrapSwrapT 属性为 .clamp,而不是 .repeat,这似乎是从 .scn 文件加载 materials 时的默认设置。

let nodes = scene.rootNode.childNodes // get a list of relevant nodes
for node in nodes {
    guard let materials = node.geometry?.materials else { continue }
    for material in materials {
        material.diffuse.wrapS = .clamp
        material.diffuse.wrapT = .clamp
        // ...confgure other material properties as necessary...
    }
}

当我放大你的纹理 png 文件时,它实际上看起来四周都有一个蓝色细边框:

您是否已确认这些线条不存在于您的实际纹理文件中,即使只有几个像素宽?

如果您确定您的原始纹理是完美的,则可能是您的纹理环绕设置有问题,正如 warrenm 评论的那样。即分配给 material.diffuse.wrapSSCNWrapModematerial.diffuse.wrapT 设置为 SCNWrapMode.repeat。我会将您的换行模式设置为 SCNWrapMode.clamp。我不确定如何在 Xcode 编辑器中编辑它,但如果您的纹理位于 Assets.xcassets 文件夹中,以编程方式它看起来像这样:

...
material.diffuse.contents = UIImage(named: "your_texture")!
material.diffuse.wrapS = SCNWrapMode.clamp
material.diffuse.wrapT = SCNWrapMode.clamp
...

或者,您可以使用 SCNWrapMode.clampToBorder 并将 material 的 borderColor 属性 设置为黑色。

但我真的会查看您的原始 png 文件,以确保纹理本身不存在蓝色边框。祝你好运!