将 QMatrix4x4 与 OpenGL 函数结合使用

2023-12-31

有没有简单的使用方法QMatrix4x4与 OpenGL 功能,特别是glMultMatrixf?

如果我理解正确的话,我必须转置矩阵,并确保转换qreal(可以是float or double取决于底层系统)GLfloat。 没有一个函数可以为我做这个吗?

我也有同样的问题QVector3D,我再次需要作为GLfloat函数中的数组glVertex3fv.


首先我想提一下QMatrix4x4具有用于矩阵乘法的内置运算符(与第二个矩阵、向量或标量)。但是,您的问题仍然需要答案,因为您迟早想将矩阵传递给 OpenGL。

QMatrix4x4 uses qreals用于内部代表。虽然该类旨在直接与 OpenGL 一起使用(使用constData()正如 Bart 在他的回答中所建议的那样),如果您想保持平台兼容性(在嵌入式设备上,qreal is float!):

// these are defined in the OpenGL headers:
void glMultMatrixf(const GLfloat *m);
void glMultMatrixd(const GLdouble *m);

// add overloaded functions which call the underlying OpenGL function
inline void glMultMatrix(const GLfloat  *m) { glMultMatrixf(m); }
inline void glMultMatrix(const GLdouble *m) { glMultMatrixd(m); }

// add an overload for QMatrix4x4 for convenience
inline void glMultMatrix(const QMatrix4x4 &m) { glMultMatrix(m.constData()); }

您也可以将这种机制用于向量,这里是glVertex*系列,它更有意义,因为“原始指针”重载需要考虑组件的数量,但面向对象的重载可以自动为您完成:

inline void glVertex2v(const GLfloat  *v) { glVertex2fv(v); }
inline void glVertex2v(const GLdouble *v) { glVertex2dv(v); }
inline void glVertex3v(const GLfloat  *v) { glVertex3fv(v); }
inline void glVertex3v(const GLdouble *v) { glVertex3dv(v); }
inline void glVertex4v(const GLfloat  *v) { glVertex4fv(v); }
inline void glVertex4v(const GLdouble *v) { glVertex4dv(v); }

// Note that QVectorND use floats, but we check this during compile time...
Q_STATIC_ASSERT(sizeof(QVector2D) == 2*sizeof(float));
Q_STATIC_ASSERT(sizeof(QVector3D) == 3*sizeof(float));
Q_STATIC_ASSERT(sizeof(QVector4D) == 4*sizeof(float));
inline void glVertex(const QVector2D &v) { glVertex2v(reinterpret_cast<const float*>(&v)); }
inline void glVertex(const QVector3D &v) { glVertex3v(reinterpret_cast<const float*>(&v)); }
inline void glVertex(const QVector4D &v) { glVertex4v(reinterpret_cast<const float*>(&v)); }

// Even for QPointF we can do it!
Q_STATIC_ASSERT(sizeof(QPointF) == 2*sizeof(qreal));
inline void glVertex(const QPointF &v) { glVertex4v(reinterpret_cast<const qreal*>(&v)); }

因此,如果进行以下更改,您的代码仍然有效:

  • Qt 改变了表示QVector* / QMatrix分别使用浮点数/双精度数,
  • 您的代码更改了向量的分量数量

...而特别是当使用原始 OpenGL 命令时,第二种情况并非如此glVertex3f.

The Q_STATIC_ASSERT上面代码中的 ion 是从 Qt 5.0 开始才定义的。如果您使用的是 Qt4(或与 Qt4 兼容的代码),请在某个全局头文件中/定义之前添加以下内容:http://ideone.com/VDPUSg http://ideone.com/VDPUSg[来源:Qt5/qglobal.h]

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

将 QMatrix4x4 与 OpenGL 函数结合使用 的相关文章

  • glTranslatef 不在 glBegin .. glEnd 中工作

    我正在尝试并排绘制不同颜色的两个方块 我的问题是我无法让 glTranslatef 将第二个方块向右移动 第二个方块只是绘制在第一个方块上 void display void glClear GL COLOR BUFFER BIT glMa
  • Qt中用于线程间通信的类设计

    问题陈述 用相机跟踪物体并相应地移动相机的方位角和仰角 Process 相机获取物体的图像 处理相机的每一帧以查找物体 应该被跟踪 并将每帧中生成的信息传递给机械设备 万向节 以平移和倾斜方式移动摄像机 Design 主 Gui 在一个线程
  • 了解 Qt3D 创建的网格

    我创建了一个 Qt3D 网格 如下所示 Qt3DCore QEntity newEntity new Qt3DCore QEntity Qt3DExtras QConeMesh mesh new Qt3DExtras QConeMesh m
  • PyQt4 信号和槽

    我正在使用 PyQt4 编写我的第一个 Python 应用程序 我有一个 MainWindow 和一个 Dialog 类 它是 MainWindow 类的一部分 self loginDialog LoginDialog 我使用插槽和信号 这
  • Qt QML 数据模型似乎不适用于 C++

    我一直在使用中的示例http doc qt digia com 4 7 qdeclarativemodels html http doc qt digia com 4 7 qdeclarativemodels html这是 QML 声明性数
  • 在OpenGL中,我可以在坐标(5, 5)处精确地绘制一个像素吗?

    我所说的 5 5 正是指第五行第五列 我发现使用屏幕坐标来绘制东西非常困难 OpenGL 中的所有坐标都是相对的 通常范围从 1 0 到 1 0 为什么阻止程序员使用屏幕坐标 窗口坐标如此严重 最简单的方法可能是通过以下方式设置投影以匹配渲
  • Q风格所有权

    在 Qt 应用程序中使用样式时 我遇到了一个有趣的问题QStyle所有权 QStyle继承自QObject 通常接受QObject parent作为构造函数参数来管理其子级的生命周期 但QStyle的构造函数没有此构造函数参数 第一个问题
  • 如何向 PyQt5 GUI 添加线程?

    所以我使用 QT Designer 创建了一个 GUI 它工作得很好 但在更复杂的调用中 它不会更新主窗口并锁定 我想运行我的CustomComplexFunction 在根据不断变化的后端信息更新主窗口中的文本编辑时 我希望它每 2 秒运
  • 在 Qt 中,许多插槽连接到同一信号,它们在发出信号时是否按顺序调用?

    In the Qt文件说 如果多个插槽连接到一个信号 则这些插槽将 按照它们连接的顺序一个接一个地执行 当信号发出时 但在connect 功能 设置Qt ConnectionType输入为Qt QueuedConnection意思是 当控制
  • 如何将 QFile 与 std::iostream 一起使用?

    是否可以像 std iostream 一样使用 QFile 我很确定那里一定有一个包装纸 问题是在哪里 我有另一个库 它需要 std istream 作为输入参数 但在我的程序中 此时我只有一个 QFile 我使用以下代码提出了自己的解决方
  • 在 Qt GraphicsView 中创建长线(或十字线)光标的最佳方法

    创建长十字线光标 与视口一样长 的简单方法是创建一条十字线graphicsItem 当鼠标移动时 设置该项目的pos财产 但是当场景复杂时这种方式会很慢 因为它要更新整个视口来更新光标的pos 另一种简单的方法是setCursor QCur
  • QFileDialog::getOpenFileName 调试时崩溃,显然是由项目名称引起的?

    我遇到了一个让我非常困惑的问题 我在 Windows 7 上使用 Qt Creator 3 1 2 和 Qt 5 3 使用 MSVC 10 0 编译器和 Windows 8 1 调试工具中的 CDB 不确定我是否应该寻找特定于 Window
  • 并排显示图像的一半 - OpenGL

    我为两个图像创建了两个纹理 现在我想在opengl中按图像2的左侧部分 完整的图像1 图像2的右侧部分的顺序显示该纹理 我已经做了如下 Image1 显示在 opengl 屏幕的中央 但屏幕的左右部分不正确 应分别显示 image2 的左侧
  • Qt - 如何使用 QNetworkAccessmanager 获取响应文本

    这是我的代码 Widget Widget manager new QNetworkAccessManager this connect manager SIGNAL finished QNetworkReply this SLOT repl
  • 为什么动态 qml 对象的创建如此缓慢,有哪些合理的替代方案?

    我想要实现的目标类似于棋盘游戏 有一个100 100的网格 放在一个Item它驻留在一个Flickable 游戏板 的各个矩形都是 svg 图像 目前大约有 20 种 可能会增加到数百种 作为基准测试 我只是尝试用元素填充 世界 Compo
  • 一个具有完全透明背景的qt小部件

    我需要创建一个 qt 小部件 它将充当其他一些小部件的父级 并对它们进行排序 现在的问题是如何使其背景完全透明 我想这样做 struct Imp Imp QWidget parent thisWidget new QWidget paren
  • 如何在不声明 32 个插槽的情况下将 32 个按钮的 pressed() 信号连接到单个函数?

    我有一个小部件 里面有 32 个按钮 我需要将每个按钮的 Pressed 信号连接到一个插槽 以便调用一个函数 该函数的参数取决于我按下的按钮 现在我通过以 on QPushButtonName pressed 的形式添加 32 个插槽来做
  • 为按钮控件 Qt Widgets 样式表定义多种样式

    如何在一个样式表中为一种控件定义多种样式 这样以后开发人员就可以选择控件应该是什么样子的样式 例如 我需要定义两种样式QPushButton 用于普通按钮 左侧 和操作按钮 右侧 对于第一个按钮 我编写了以下样式 QPushButton b
  • QML 圆规

    我目前正在创建一个虚拟仪表板 我想获得针后面的进度条类型 如以下链接所示 https forum qt io topic 89307 qml circular gauge styling needle trailing colour glo
  • Qt 和 Sqlite 示例

    我正在寻找一些使用 Qt 的示例代码 它是带有 Sqlite 驱动程序的 SQL 模块 我需要示例的主要原因是我之前有 Qt 数据库接口的经验 并且 Sqlite 在字段类型方面有一些奇怪的行为 类型是按字段存储的 而不是按列存储的 The

随机推荐

  • 获取 iOS 中当前的设备语言?

    我想显示设备用户界面当前使用的语言 我会使用什么代码 我想要这个作为NSString以完全拼写的格式 不是 en US 编辑 对于那些路过的人来说 这里有大量有用的评论 因为答案随着新的 iOS 版本而演变 提供的解决方案实际上将返回设备的
  • C++ 中的类型转换

    我正在使用 C 编程原理与实践 这本书学习 C 两个月 现在我想澄清一些关于我的选角的疑问 当我执行隐式转换时 例如 char c a int b c 这里 c 的值被隐式转换为 int 类型 而不使用任何显式运算符 这算不算选角 或者当我
  • 如何根据一年中的星期计算每月中的星期?

    我找到了一个node js https stackoverflow com questions 33647513 get the week number of the month from week number of the year解决
  • 如何在优先约束编辑器中使用在执行 SQL 任务中创建的变量值?

    I need to run n multiple Execute SQL Task based on n multiple variable value isnull true or false This variable is creat
  • Windows 文件名中的分号

    我的一位用户问为什么我的应用程序不支持文件名中的分号 我单步执行了我的代码 看起来 Windows 功能获取打开文件名截断任何包含分号的文件名 例如 一 二 wav gt 一 微软说不允许使用冒号 但没有提到分号 命名文件 路径和命名空间
  • 使 HTML 内容展开以填充窗口

    我有一个 HTML 页面 垂直分为 Header Body Footer 身体又被水平分为 左侧有一个大 DIV 周围有滚动条 显示图表的一部分 右边有一个表格 页眉和页脚是固定高度的 正文应垂直扩展以填充窗口中未被页眉和页脚占据的部分 同
  • 使用Spring(mvc)进行文件上传和下载

    我对 Spring MVC 很陌生 但对 Java 并不陌生 我正在尝试向数据库上传数据以及从数据库下载数据 我在这个网站上做了类似的事情 使用 spring mvc 文件上传和下载 https gardiary wordpress com
  • 无法使用 urllib2 从网络保存图像

    我想使用 python 保存网站上的一些图像urllib2但是当我运行代码时它会保存其他东西 这是我的代码 user agent Mozilla 4 0 compatible MSIE 5 5 Windows NT headers User
  • 为什么 CUDA 内核中 z 始终为零

    我正在使用 Cudafy 在 NVIDIA GPU 上进行一些计算 Quadro K1100M 功能 3 0 如果重要的话 我的问题是 当我使用以下内容时 cudaGpu Launch new dim3 44 8 num new dim 8
  • 在 Oracle SQL Developer 代码窗口中运行带有变量的 sql 代码

    我正在使用 Oracle SQL Developer 编写代码 我有一个有效的简单选择语句 SELECT CFS CAE SEC ID CFS FM SEC CODE CFS LAST USER ID case when 1 1 then
  • 导出使用 Proguard 的应用程序时出错

    我尝试在我的应用程序中使用 Proguard 我在 proguard cfg 文件中编写了这段代码 optimizationpasses 5 dontusemixedcaseclassnames dontskipnonpubliclibra
  • 删除时 AWS S3 访问被拒绝

    我有一个可以毫无问题地写入的存储桶 但是 当我尝试删除对象时 出现错误 AccessDeniedException in NamespaceExceptionFactory php line 91 遵循非常基本的示例here http do
  • 如何在 Linux 上用 C 检查堆栈和堆的使用情况?

    有没有办法在Linux上检索C中的堆栈和堆使用情况 我想知道堆栈 堆专门占用的内存量 如果您知道进程的 pid 例如 1234 则可以使用pmap 1234命令 打印内存映射 您还可以阅读 proc 1234 maps文件 实际上是一个文本
  • ANSI C 中的复合语句(块)是否被括号表达式包围?

    浏览我找到的 Linux 内核源代码一些代码 http lxr linux no linux v2 6 30 arch x86 include asm uaccess h L332其中括号包围的语句块被视为表达式口齿不清 或ML 即一个表达
  • 为 iPad 进行编译时是否设置了特定的 Xcode 编译器标志?

    为 iPad 进行编译时是否设置了特定的 Xcode 编译器标志 我想有条件地编译 iPad 与 iPhone iPod Touch 代码 例如 ifdef TARGET IPAD code for iPad else code for i
  • Eclipse 3.7 Indigo:“关于对话框”错误

    我最近将 Eclipse 3 6 实例升级到 3 7 我想查看 帮助 gt 关于 Eclipse 选项 但没有显示此对话框 使用 consoleLog debug 选项运行它以了解可能出现的问题 这就是我所看到的 有什么想法吗 顺便说一句
  • 将 ETag / Last-Modified 装饰器与 Django 基于类的通用视图一起使用

    我最近将 Django 项目之一中的所有视图迁移到新的基于类的视图 对于经典的基于函数的 Django 视图 有一个方便的装饰器django views decorators http condition如果存在与您指定的条件匹配的缓存副本
  • 反应堆模式在 Node.js 中如何工作?

    我正在阅读 Node js 设计模式 我陷入了对反应堆模式的理解中 我在这里没有看到任何调用堆栈 我认为调用堆栈是 Node js 设计的主要部分之一 谁能帮我理解这张图吗 此外 没有回调队列 一切都从应用程序开始 应用程序发出请求 事件多
  • 如何在 AngularJS 中大写和大写?

    我想将 HTML 表单中的某些字段大写 大写 HTML
  • 将 QMatrix4x4 与 OpenGL 函数结合使用

    有没有简单的使用方法QMatrix4x4与 OpenGL 功能 特别是glMultMatrixf 如果我理解正确的话 我必须转置矩阵 并确保转换qreal 可以是float or double取决于底层系统 GLfloat 没有一个函数可以