1

我正在尝试使用一个在 SceneKit 中创建类似画布的东西SCNBoxUIImage从一个表面“包裹”到与之相邻的其他四个表面上。

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

任何人都可以在这里引导我朝着正确的方向前进吗?盒子将在与“正面”相对的一侧具有单独的纹理/材质。

在此处输入图像描述

4

2 回答 2

1

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

一些带有简化示例的解释:

让我们假设您正在使用立方体并且您有这样的纹理 在此处输入图像描述

通过将其划分为矩形,您将拥有 在此处输入图像描述

你想跳过矩形1, 3, 7, 9并用这个纹理覆盖你的立方体。为此,只需将边的大小从SCNBox0 到 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 个面,最后一个(背面)仅使用颜色并将它们设置materials为您的SCNBox. 结果你会得到

在此处输入图像描述

于 2020-11-25T06:42:02.440 回答
0

最简单的方法可能是使用匹配的纹理坐标创建自定义几何体+geometryWithSources:elements:

于 2020-11-23T16:55:34.370 回答