以正确的方式给出纹理
Given the texture in the right way
因此,如您所见,相框的纹理是一个正方形图像。但是当我将它设置为漫反射内容时,效果很糟糕。那么如何才能在矩形框内显示正方形图片而不拉伸图片呢
您看到的很多内容取决于纹理映射到的几何体。假设这些相框是 SCNPlane
或 SCNBox
几何图形,则相框的表面纹理坐标范围从左上角的 (0,0)
到右下角的 (1,1)
,无论几何体的尺寸或纵横比。
SceneKit 纹理映射图像,使得图像的左上角位于纹理坐标 (0,0)
,右下角位于 (1,1)
,而不管图像的像素尺寸如何。因此,除非您的几何图形的纵横比与纹理图像的纵横比相匹配,否则您将看到像这样的图像被拉伸的情况。
您可以对 "fix" 纹理做一些事情:
了解(或计算)图像的纵横比和要放置的几何形状(面),然后使用 material 的 contentsTransform
来更正图像。
例如,如果您有一个宽度为 2、高度为 1 的 SCNPlane
,并且您为其分配了一个正方形图像,图像将被水平拉伸。如果将 contentsTransform
设置为使用 SCNMatrix4MakeScale(1,2,1)
创建的矩阵,它将在水平方向上加倍纹理坐标,有效地将图像在该方向上缩放一半,"fixing" 的纵横比你的 2:1 飞机。请注意,您可能还需要翻译,具体取决于您希望 half-width 图像出现在几何体表面的位置。
如果您在 Xcode 的场景编辑器中执行此操作,contentsTransform
是 "offset"、"scale" 和 "rotation" 中的控件material 编辑器,在您在屏幕截图中分配图像的位置下方。
了解(或计算)几何图形的纵横比,至少了解一些关于图像大小的信息,并创建修改后的纹理图像以适应。
例如,如果你有一个像上面那样的 2:1 平面,你想在上面放一个 320x480 的图像,创建一个尺寸为 960x480 的新纹理图像——也就是说,匹配飞机。您可以使用此图像创建您想要的任何风格的背景,并将您的 320x480 图像合成在该背景之上您想要的任何位置。
我在 material 编辑器中更改比例和偏移以及 WrapT 属性。而且效果很好。但是当我 运行 它时,我无法获得相同的效果。所以我尝试通过更改 contentsTransform 属性 来编程。但是 scale,offset 它们都会影响 contentsTransform。那么如果offSet是(0, -4.03),Scale是(1, 1,714),contentsTransform是什么?
因此,如您所见,相框的纹理是一个正方形图像。但是当我将它设置为漫反射内容时,效果很糟糕。那么如何才能在矩形框内显示正方形图片而不拉伸图片呢
您看到的很多内容取决于纹理映射到的几何体。假设这些相框是 SCNPlane
或 SCNBox
几何图形,则相框的表面纹理坐标范围从左上角的 (0,0)
到右下角的 (1,1)
,无论几何体的尺寸或纵横比。
SceneKit 纹理映射图像,使得图像的左上角位于纹理坐标 (0,0)
,右下角位于 (1,1)
,而不管图像的像素尺寸如何。因此,除非您的几何图形的纵横比与纹理图像的纵横比相匹配,否则您将看到像这样的图像被拉伸的情况。
您可以对 "fix" 纹理做一些事情:
了解(或计算)图像的纵横比和要放置的几何形状(面),然后使用 material 的
contentsTransform
来更正图像。例如,如果您有一个宽度为 2、高度为 1 的
SCNPlane
,并且您为其分配了一个正方形图像,图像将被水平拉伸。如果将contentsTransform
设置为使用SCNMatrix4MakeScale(1,2,1)
创建的矩阵,它将在水平方向上加倍纹理坐标,有效地将图像在该方向上缩放一半,"fixing" 的纵横比你的 2:1 飞机。请注意,您可能还需要翻译,具体取决于您希望 half-width 图像出现在几何体表面的位置。如果您在 Xcode 的场景编辑器中执行此操作,
contentsTransform
是 "offset"、"scale" 和 "rotation" 中的控件material 编辑器,在您在屏幕截图中分配图像的位置下方。了解(或计算)几何图形的纵横比,至少了解一些关于图像大小的信息,并创建修改后的纹理图像以适应。
例如,如果你有一个像上面那样的 2:1 平面,你想在上面放一个 320x480 的图像,创建一个尺寸为 960x480 的新纹理图像——也就是说,匹配飞机。您可以使用此图像创建您想要的任何风格的背景,并将您的 320x480 图像合成在该背景之上您想要的任何位置。
我在 material 编辑器中更改比例和偏移以及 WrapT 属性。而且效果很好。但是当我 运行 它时,我无法获得相同的效果。所以我尝试通过更改 contentsTransform 属性 来编程。但是 scale,offset 它们都会影响 contentsTransform。那么如果offSet是(0, -4.03),Scale是(1, 1,714),contentsTransform是什么?