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 个面,最后一个(在背面)只用颜色填充,并将它们设置为 SCNBox
的 materials
属性。
结果你会得到
我正在尝试使用 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 个面,最后一个(在背面)只用颜色填充,并将它们设置为 SCNBox
的 materials
属性。
结果你会得到