SCNBox – 将纹理映射到六个边中的五个

SCNBox – Map a texture onto five of six sides

我正在尝试使用 SCNBox 在 SceneKit 中创建类似 canvas 的东西,UIImage 从一个表面“包裹”到与其相邻的其他四个表面.

目前我能想到的唯一方法是将 UIImage 分成五个单独的图像并将它们作为材料放在边上,但我相信一定有更简单的方法.

任何人都可以在这里引导我朝着正确的方向前进吗?该框将在“正面”的对面有一个单独的 texture/material。

最简单的方法可能是使用 +geometryWithSources:elements:

创建具有匹配纹理坐标的自定义几何体

您可以使用 SCNMaterialProperty 中的 contentsTransform 属性,将图像所需的纹理坐标调整为 SCNBox

一些简单示例的解释:

假设您正在使用立方体并且您有这样的纹理

把它分成矩形,你会得到

你想跳过矩形 1, 3, 7, 9 并用这个纹理覆盖你的立方体。 为此,只需将 SCNBox 边的大小标准化为 0 和 1 之间,并使用它来设置 contentsTransform 矩阵中的比例和变换。

在我的例子中我有一个等边的立方体 - 所以它将是整个纹理的第三部分。从纹理

中获取 5 矩形
let normalizedWidth = 1/3
let normilizedHeight = 1/3

let xOffset = 1 //skip 1,4,7 line
let yOffset = 1 //skip 1,2,3 line
let sideMaterial = SCNMaterial()
sideMaterial.diffuse.contents = textureImage
let scaleMatrix = SCNMatrix4MakeScale(normalizedWidth, normilizedHeight, 0.0)
sideMaterial.diffuse.contentsTransform = SCNMatrix4Translate(scaleMatrix, 
normalizedWidth * xOffset, yOffset * yOffset, 0.0)

您可以用配置的材料填充 5 个面,最后一个(在背面)只用颜色填充,并将它们设置为 SCNBoxmaterials 属性。 结果你会得到