在OpenGL中从矩阵获取位置、旋转和缩放

2024-02-15

目前我正在学习用于 Android 开发的 OpenGL ES。现在我正处于必须处理的时刻ModelMatrixCameraMatrix但我对此有一些疑问:在 OpenGL 中,我们总是使用 4x4 矩阵,我理解为什么要这样做,但我不知道不同的值存储在这个矩阵中的位置。例如旋转和位置。假设我们有这个 4x4 矩阵:

      0   1   2   3
    -----------------
 0  |   |   |   |   |
    -----------------
 1  |   |   |   |   |
    -----------------
 2  |   |   |   |   |
    -----------------
 3  |   |   |   |   |
    -----------------

你能告诉我在哪里可以找到当前的rotation, positionscale该矩阵中的物体/相机的数量?这是针对同一位置的每个矩阵吗?


为了简单起见,我假设矩阵仅包含旋转、平移和均匀缩放的组合。一般变换矩阵可以表示其他类型的翻译,例如:

  • 不均匀缩放。
  • 剪切变换。

旋转和缩放位于矩阵的左上角 3x3 部分,它们是每个方向上索引为 0 到 3 的元素。如果没有缩放,这个 3x3 矩阵的每个行向量的长度为 1.0。如果存在缩放,您可以通过计算以下任意行向量的长度来计算缩放因子:

scalingFactor = sqrt(m00 * m00 + m01 * m01 + m02 * m02);

然后通过将 3x3 子矩阵的所有元素除以缩放因子来获得旋转矩阵:

                                         [ m00 m01 m02 ]
rotationMatrix = (1.0 / scalingFactor) * [ m10 m11 m12 ]
                                         [ m20 m21 m22 ]

平移向量位于最后一列的前 3 个元素中:

                    [ m03 ]
translationVector = [ m13 ]
                    [ m23 ]

综上所述,请记住 OpenGL 希望矩阵以列优先顺序存储。所以矩阵在内存中的排列是:

m00 m10 m20 m30 m01 m11 ...
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在OpenGL中从矩阵获取位置、旋转和缩放 的相关文章

随机推荐

  • 在数据框中应用函数时,dim(X) 必须具有正长度

    我正在尝试将此函数应用于数据框列 best recom lt function x n 1 y lt result2 x order result2 x n inds which result2 x y arr ind TRUE recom
  • 在 div 中垂直和水平居中文本

    我有一个 div 其中包含覆盖有文本的图形背景 我想使这个元素水平和垂直居中 但我无法让文本垂直居中 到目前为止 我有以下代码 div div img src buttonbackground png class stretch alt d
  • Visual Studio 2013 - Git - 获取远程分支

    我开始使用 Visual Studio 2013 和 Visual Studio Online 的内置 Git Team Explorer 工具 我非常熟悉如何通过 Git Shell 执行此操作 但似乎不知道如何通过 VS 2013 界面
  • 如何停止/退出 AWS Glue 作业 (PySpark)?

    我成功运行了一个 AWS Glue 作业 可以转换数据以进行预测 如果达到特定条件 我想停止处理并输出状态消息 正在运行 if specific condition is None s3 put object Body json str B
  • 应用程序被终止时是否可以收到 FCM 推送通知?

    我正在开发一个电子邮件应用程序 我希望用户在收到新电子邮件后立即收到推送通知 为此 我使用 FCM 我刚刚通过以下链接尝试使用 FCM 推送通知 为了测试 FCM 提供哪些功能 但我面临的问题是 当应用程序位于前台或后台时 设备会收到推送通
  • 为什么值类型创建在堆栈上而引用类型创建在堆上?

    编程语言书籍通常解释说 值类型是在堆栈上创建的 而引用类型是在堆上创建的 我的问题是为什么 我的问题是为什么 他们为什么要 解释 这一点 因为有时作者自己也不太了解 有时他们又懒得正确解释 事实却相当复杂 幸运的是 埃里克 利珀特 Eric
  • 使用 std::string 保存二进制数据以避免手动动态内存管理是否有效

    注意base64 decode in http www adp gmbh ch cpp common base64 html http www adp gmbh ch cpp common base64 html std string ba
  • 如何在rails下的webrick中设置access-control-allow-origin?

    我编写了一个小型 Rails 应用程序 通过 xmlhttprequests 向另一个站点提供内容 该站点将从另一个域运行 不可能让它们在同一服务器上运行 我了解我需要在 Rails 服务器上设置 access control allow
  • 结帐页面中的 Woocommerce 付款方式检测

    我正在使用 woocommerce 插件和 woocommerce 的 Braintree 扩展进行付款 我已启用 woocommerce Braintree 的卡和贝宝付款来结账 我试图弄清楚如何在用户实际结账和付款之前知道用户选择哪个支
  • 停止所有子元素的 jQuery 动画

    祝大家新年快乐 我只是想问是否有任何方法可以停止元素的所有子节点的 jquery 动画 我的意思是 如果我在文档中有一个下面的 html 结构 并且我已经对容器内的所有 div 应用了不同的动画 有些也在 queue false 等中 di
  • 哪种嵌入式消息传递系统 -> ActiveMQ 或 HornetQ [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我希望得到一些关于这两个消息系统中哪一个的一般性指示和意见 更容易管理 需要了解和避免的陷阱或神奇的东西
  • 如何在 JUnit 5 中参数化 beforeEach()?

    我使用 JUnit 5 作为我的测试运行程序 在设置方法中 我硬编码了 3 个参数 platformName platformVersion and deviceName 我有一个测试方法 应该测试各种组合 这意味着 当运行我的testLo
  • ffmpeg在特定时间混合音频

    我想将 2 个音频文件混合在一起 一个文件的长度为 2 分钟 另一个文件的长度为 10 秒 我希望两个文件混合 这样仍然可以听到两个声音 我希望这个 10 秒的剪辑恰好在 10 秒的 30 秒处出现 这样它就会在 40 秒处结束 我知道如何
  • R 中的 apply() 与用户定义函数

    我有一个数据框 其中有如此排列的选票和政党标签 dat lt data frame v1 c 25 0 70 v2 c 75 100 20 v3 c 0 0 10 l1 c pA pB l2 c pB pC pC l3 c pD 这样每一行
  • 在 Angular 2/材质的对话框模式中禁用自动对焦

    我正在使用 Angular Material 2 中的对话框 问题是 尤其是在 iPhone 或平板电脑中打开模态对话框时 我无法禁用自动对焦 在 iOS 中 它会自动聚焦对话框中的第一个输入字段 我尝试使用 tabindex 并在其他输入
  • 如何在 Django-Rest-Framework 序列化器中获取 Request.User?

    我已经尝试过类似的方法 但它不起作用 class PostSerializer serializers ModelSerializer class Meta model Post def save self user self contex
  • 通过基于事件的通信做出反应

    我正在尝试在 a 中使用 Reactvscode 网页视图面板 https code visualstudio com api extension guides webview 我认为自己是 React 中的一个不错的组件 但我习惯于通过
  • 如何识别应用程序在 Linux 上以深色主题运行?

    我开发了一个使用 qscintilla 作为文本编辑器的应用程序 我还实现了自定义词法分析器来突出显示特定于语言的关键字 到目前为止 突出显示关键字的样式已硬编码在我的应用程序中 并且在 Windows Linux Ubuntu Mac 上
  • iOS 应用内购买:沙盒产品 ID 无效

    在我解决这个问题之前 先介绍一下稍微奇怪的设置的背景 为客户开发一个应用程序 我们使用的 iTunes 开发者帐户与最终发布的用于开发和临时构建应用程序的帐户不同 具有游戏中心和 IAP 集成 显然 我们最终将不得不在最终发布帐户上复制我们
  • 在OpenGL中从矩阵获取位置、旋转和缩放

    目前我正在学习用于 Android 开发的 OpenGL ES 现在我正处于必须处理的时刻ModelMatrix和CameraMatrix但我对此有一些疑问 在 OpenGL 中 我们总是使用 4x4 矩阵 我理解为什么要这样做 但我不知道