- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
编辑:这对我来说是“倒退” - 我可能缺少一些直觉
给定一个 glm 变换函数,例如 glm::translate,两个参数首先是一个矩阵 m,然后是一个用于平移的 vector v。
直观上,我希望这个函数在矩阵变换“之后”应用平移,即将对象乘以返回的矩阵将首先应用m,然后应用平移v 指定。
这种直觉来自这样一个事实:人们通常按照数学顺序构建一个转换,例如首先计算缩放矩阵,然后应用旋转,然后变换等。所以我认为函数调用顺序将是相同的(即给定一个矩阵,我可以简单地调用 glm::translate 来应用应用矩阵变换后发生的平移)
但是,正如 this 中提到的线程,情况并非如此 - 首先应用翻译,然后传入矩阵 m。
我不认为这与某些线程建议的列主要/行主要约定和符号有任何关系。这有历史原因吗?对我来说这似乎有点倒退,除非有足够的理由,否则我可能会重写这些函数。
最佳答案
This intuition comes from the fact that one usually builds a transformation in mathmetical order
但是不存在数学顺序这样的东西。考虑以下情况:v
是一个 n 维 vector ,而 M
是 n x n 方阵。现在的问题是:哪个是正确的乘法顺序?这又取决于你的惯例。在大多数经典数学教科书中, vector 被定义为列 vector 。然后:M * v
是唯一有效的乘法顺序,而 v * M
在数学上根本不是有效的运算。
如果v
是列 vector ,那么它的转置v^T
是行 vector ,然后v^T * M
是唯一有效的乘法顺序。但是,要获得与之前相同的结果,例如 x = M * v
,您还必须转置 M
:x^T = v^T * M ^T
.
如果M
是两个矩阵A
和B
的乘积,由于矩阵乘法的非交换方式,我们得到的结果是这样的:
x = M * v
x = A * B * v
x = A * (B * v)
或者,我们可以说:
y = B * v
x = A * y
很明显,首先应用B
。
在行矩阵的转置约定中,我们需要遵循(A * B)^T = B^T * A^T
并得到
x^T = v^T * M^T
x^T = v^T * B^T * A^T
x^T = (v^T * B^T) * A^T
因此首先再次应用B^T
。
实际上,当您考虑乘法顺序时,最接近 vector 的矩阵通常是最先应用的矩阵。
I don't believe this has anything to do with column major/row major convention and notation as some threads suggest.
你说得对,这与此完全无关。存储顺序可以是任意的,并且不会改变矩阵和运算的含义。混淆通常来自这样一个事实:将按列存储的矩阵解释为按行存储的矩阵(反之亦然)只会产生转置矩阵的效果。
此外,GLSL 和 HLSL 以及许多数学库不使用显式的列 vector 或行 vector ,而是根据需要使用它。例如,在 GLSL 中你可以这样写:
vec4 v;
mat4 M;
vec4 a = M * v; // v is treated as column vector here
vec4 b = v * M; // v is treated as row vector now
// NOTE: a and b are NOT equal here, they would be if b = v * transpose(M), so by swapping the multiplication order, you get the effect of transposing the matrix
Is there a historical reason for this?
OpenGL 在很多方面都遵循经典数学约定(即窗口空间原点位于左下角,而不是大多数窗口系统的左上角),旧的固定函数 View 空间约定是使用右手坐标系(z
指向屏幕外的观看者,因此相机朝向 -z
),并且 OpenGL 规范至今仍使用列 vector 。这意味着顶点变换必须是 M * v
并且应用变换的“反向”顺序。
这意味着,在旧版 GL 中,以下序列:
glLoadIdentity(); // M = I
glRotate(...); // M = M * R = R
glTranslate(...); // M = M * T = R * T
将首先平移对象,然后旋转它。
GLM 的设计默认遵循 OpenGL 约定,函数 glm::mat4 glm::translate(glm::mat4 const& m, glm::vec3 const& Translation);
为 explicitely emulating the old fixed-function GL behavior .
It just seems a bit backwards to me and I would probably rewrite the functions unless there's a good enough reason for it.
如你所愿。您可以设置函数来代替 psot-multiply 进行预乘。或者您可以将所有变换矩阵设置为转置,并按照您认为“直观”的顺序进行后乘。但请注意,对于遵循经典数学约定或典型 GL 约定的人来说,“向后”符号是“直观”符号。
关于c++ - 为什么应用 glm 变换函数 "backwards"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68634914/
我是学习深度学习的新手,我一直在努力理解 Pytorch 中的“.backward()”是做什么的,因为它几乎完成了那里的大部分工作。因此,我试图详细了解反向函数的作用,因此,我将尝试逐步编写该函数的
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引起辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the he
我正在开发一个同时具有 GUI(图形)和 API(脚本)界面的应用程序。我们的产品有一个非常大的安装基础。许多客户投入了大量时间和精力来编写使用我们产品的脚本。 在我们所有的设计和实现中,我们(可以理
我从事的项目以源代码和二进制形式免费分发,因为我们的许多用户需要专门为他们的系统编译它。这需要一定程度的考虑,以保持与旧主机系统(主要是它们的编译器)的向后兼容性。 其中一些最糟糕的,例如 GCC 3
我需要在 Python 中创建一个树状结构。我有一个函数 get(parentId),它返回具有该父级的对象列表——我认为应该递归地完成。 结果应该是这样的:["root object", ["chi
我正在尝试为移动菜单制作动画,因此当点击它时三条纹应该变成“X”,当关闭菜单时它应该恢复为三条纹。 “X”的动画效果非常好,但关闭时它会跳回三条纹,而不是平滑地过渡回它。这是因为我当然完全删除了 x
训练用PyTorch编写的LSTM或RNN时,在loss.backward()上报错: RuntimeError: Trying to backward through the graph
为什么参数到atan2功能是“倒退”的?即,为什么它接受 y, x 形式的坐标而不是标准 x, y ? 最佳答案 因为它类似于atan(y / x) , 与 y作为分子和 x作为分母。 关于math
data.table很棒,因为我可以进行滚动连接,甚至可以在组内进行滚动连接! library(data.table) set.seed(42) metrics metrics[calendar,r
我正在开发一个 grails 插件,它添加了一个新的标签库并呈现了一个模板。 我的问题是这个模板输出一个 JSON 并且我不需要它被编码。 如果我使用 raw() 函数,它工作正常,但这与 grail
我想匹配字符串中的数字:'abc@2003,或其他@2017'我想通过 match 函数获得结果 [2003, 2007]。 let strReg = 'abc@2003, or something
Douglas Crockford,因此,JSLint 真的不喜欢 for 循环。大多数时候我同意,并使用 [].forEach 和 Object.keys(obj) 遍历数组或字典。 但是,在某些情
这个问题在这里已经有了答案: Difference between null == x and x == null? [duplicate] (5 个答案) 关闭 7 年前。 我正在查看一些代码,发
我有一个 PyTorch 计算图,它由一个执行某些计算的子图组成,这个计算的结果(我们称它为 x)然后被分支到另外两个子图中。这两个子图的每一个都会产生一些标量结果(我们称它们为 y1 和 y2)。我
不是从前面读取文件,而是可以向后读取它吗?这样输出是从文件的后面到文件的前面。 编辑:最后一行首先显示,而不是完全向后显示。 最佳答案 这是可能的,但很麻烦。 Lua API 提供 seek函数来设置
我用 Storyboard 创建了我的应用程序,直到很晚才意识到 iOS4.3 设备将不受支持。是否有一个选项可以将 Storyboard View 复制到 xib 中或在运行时以编程方式执行此操作?
我为那些犯了同样错误的人发布了这个问题。尝试计算梯度时出现此错误: criterion = torch.nn.CrossEntropyLoss() loss = criterion(y_hat, y_
我一直在阅读this article并且在他们的一节中指出: Lenses compose backwards. Can't we make (.) behave like functions? Yo
编辑:这对我来说是“倒退” - 我可能缺少一些直觉 给定一个 glm 变换函数,例如 glm::translate,两个参数首先是一个矩阵 m,然后是一个用于平移的 vector v。 直观上,我希望
我正在使用调查图/图遍历 compile group: 'org.jgrapht', name: 'jgrapht-core', version: '1.1.0' 使用下面的代码我可以创建一个简单的图
我是一名优秀的程序员,十分优秀!