【发布时间】:2021-06-03 17:46:10
【问题描述】:
我是 Metal 和 SceneKit 的 3D 渲染新手。我看到需要将特定的“逆”变换传递给渲染器/着色器。我打印了变换,看不到它们之间的关系。谷歌搜索结果是一堆相当高级的主题。
所以我问一个像我这样的傻瓜的问题:
着色器的“反向”视图变换是什么意思?
如果我不反转变换会发生什么?
// Apple code below (with original comment):
// Pass view-appropriate image transform to the shader modifier so
// that the mapped video lines up correctly with the background video.
let sceneView = renderer as? ARSCNView,
let frame = sceneView.session.currentFrame
let affineTransform = frame.displayTransform(for: .portrait, viewportSize: self.view.bounds.size)
let transform = SCNMatrix4(affineTransform)
let inverse = SCNMatrix4Invert(transform) // pass to shader
transform:
SCNMatrix4(
m11: 0.0, m12: 1.0, m13: 0.0, m14: 0.0,
m21: -1.5227804, m22: 0.0, m23: 0.0, m24: 0.0,
m31: 0.0, m32: 0.0, m33: 1.0, m34: 0.0,
m41: 1.2613902, m42: -0.0, m43: 0.0, m44: 1.0)
----
inversed:
SCNMatrix4(
m11: 0.0, m12: -0.6566935, m13: 0.0, m14: 0.0,
m21: 1.0, m22: 0.0, m23: 0.0, m24: 0.0,
m31: 0.0, m32: 0.0, m33: 1.0, m34: 0.0,
m41: 0.0, m42: 0.8283468, m43: 0.0, m44: 1.0)
这里有一些信息表明上述矩阵是平移、旋转和缩放的组合。虽然 CGAffine 变换将它们拆分为不同的元素,但在这里它们都被夹在一起:
https://www.javatpoint.com/computer-graphics-3d-inverse-transformations
【问题讨论】:
-
我的数学演讲不太好,但基本上,变换是一个矩阵,可以让你从一个坐标系转到另一个坐标系。它通过改变一个向量来做到这一点,你正在从一组基向量转换为另一组基向量。而逆变换则相反。如果您有一个变换,可以让您从世界坐标系转到视图坐标系(以便在乘以任何世界向量后成为视图向量),则反向执行相反的操作:将视图向量返回到世界向量。矩阵和变换在 3D 中是相同的,因为所有线性变换都只能表示为矩阵。
-
基本上,这归结为线性代数和仿射变换。有文章和书籍可以更好地解释它,尽管我没有具体的链接。
标签: shader scenekit metal ios14 cgaffinetransform