关于内容转换。3D 变换矩阵如何工作?

Hao*_*ong 5 matrix ios scenekit swift

我听说我可以使用contentsTranform修改纹理。但如何呢?contentTranform 是一个 SCNMatrix,从文档中我可以使用 SCNMatrix4MakeTranslation\xe3\x80\x81SCNMatrix4MakeRotation 和 SCNMatrix4MakeScale 函数来创建矩阵。但我不知道如何像第二张图片一样显示纹理。相框为 1:2,纹理为 1:1。

\n

在此输入图像描述

\n

在此输入图像描述

\n

在此输入图像描述

\n
\n

两次编辑:

\n

我在材质编辑器中更改了比例和偏移以及 WrapT 属性。而且效果也不错。但是当我运行它时,我无法得到相同的效果。所以我尝试通过更改 contentTransform 属性来进行编程。但比例、偏移量都会影响contentTransform。那么如果offSet是(0, -4.03)并且Scale是(1, 1.714),那么contentTransform是多少

\n

在此输入图像描述

\n

sta*_*all 0

解决方案来自@HaoDong的问题帖子。

现在我知道解决办法是什么了。

第一的

不要加载 .dae 文件作为 SCNScene。支持使用.scn文件。发生错误是因为我使用 .dae 文件在场景编辑器中修改纹理。然后当我运行它时,我无法得到相同的结果。我将其更改为.scn文件并修改纹理后。我在真实设备上得到了正确的效果。您可以通过->编辑器->转换为SceneKit场景文件格式简单地将.dae转换为.scn文件。

第二

偏移量和缩放值都会影响属性的值contentsTransform。我已经在材质编辑器视图中修改了纹理。如果 offsetSet 为 (0, -4.03) 并且 Scale 为 (1, 1.714),则属性contentsTransformSCNMatrix4(m11: 1.0, m12: 0.0, m13: 0.0, m14: 0.0, m21: 0.0, m22: 1.714, m23: 0.0, m24: 0.0, m31: 0.0, m32: 0.0, m33: 1.0, m34: 0.0, m41: 0.0, m42: -4.03, m43: 0.0, m44: 1.0)。通过搜索文档,我找到了如何获取此属性。

var matrixA =  SCNMatrix4MakeTranslation(0, -4.0, 0)
var matrixB = SCNMatrix4MakeScale(1, 1.345, 1)

var b = SCNMatrix4Mult(matrixB, matrixA)
Run Code Online (Sandbox Code Playgroud)

确保它是 MakeScale * MakeTranslation