鉴于正确的纹理

在此处输入图像描述

如您所见,photoFrame的纹理是方形图像。 但是当我将它设置为漫reflection内容时,效果非常糟糕。 那么如何在矩形框中显示方形图像,而不是拉伸图像。

您看到的很多内容取决于纹理映射到的几何体。 假设这些图像帧是SCNPlaneSCNBox几何图形,则框架的面具有从左上角的(0,0)到右下角的(1,1)纹理坐标,而不管几何体的尺寸或纵横比。

SceneKit纹理映射图像,使得图像的左上角位于纹理坐标(0,0) ,而右下角位于(1,1)而不管图像的像素尺寸如何。 因此,除非您的纵横比与纹理图像的纵横比相匹配,否则您将看到图像被拉伸的情况。

你可以做几件事来“修复”你的纹理:

  1. 知道(或计算)图像的宽高比和要放置它的几何体(面),然后使用材质的contentsTransform来校正图像。

    例如,如果您的SCNPlane宽度为2且高度为1,并且为其指定了方形图像,则图像将水平拉伸。 如果将contentsTransform设置为使用SCNMatrix4MakeScale(1,2,1)创建的矩阵, SCNMatrix4MakeScale(1,2,1)在水平方向SCNMatrix4MakeScale(1,2,1)纹理坐标加倍,有效地将图像缩放为该方向的一半,“固定”2的宽高比: 1架飞机。 请注意,您可能还需要翻译,具体取决于您希望半角图像显示在几何体的面上的位置。

    如果您在Xcode的场景编辑器中执行此操作,则contentsTransform是材质编辑​​器中的“偏移”,“缩放”和“旋转”控件,位于屏幕截图中指定图像的位置下方。

  2. 了解(或计算)几何体的纵横比,以及至少一些有关图像大小的信息,并创建适合的修改后的纹理图像。

    例如,如果您具有上述2:1平面,并且要在其上放置320×480图像,请创建尺寸为960×480的新纹理图像 – 即匹配平面的纵横比。 您可以使用此图像创建您想要的任何风格的背景,将320×480图像合成在该背景之上的任何位置。

在此处输入图像描述

我在材质编辑器中更改了比例和偏移以及WrapT属性。 效果很好。 但是当我运行它时,我无法获得相同的效果。 所以我尝试通过更改contentsTransform属性来编程。 但是规模,偏移它们都会影响contentsTransform。 因此,如果offSet为(0,-4.03)且Scale为(1,11714),那么contentsTransform是什么?