OpenGL:缩放然后翻译?如何?

2024-01-21

我有一些二维几何。我想在我的几何体周围获取一些边界矩形,然后在平面上的其他地方渲染它的较小版本。以下或多或少是我必须进行缩放和翻译的代码:

// source and dest are arbitrary rectangles.
float scaleX = dest.width / source.width;
float scaleY = dest.height / source.height;
float translateX = dest.x - source.x;
float translateY = dest.y - source.y;

glScalef(scaleX, scaleY, 0.0);
glTranslatef(translateX, translateY, 0.0);
// Draw geometry in question with its normal verts.

当目标原点为 0 时,对于给定维度,这完全按照预期工作。但是,如果 x 的原点非零,则结果仍然正确缩放,但看起来(?)它在该轴上转换为接近零的值无论如何——事实证明它与 dest.x 为零时并不完全相同。

有人可以指出我遗漏的一些明显的东西吗?

Thanks!

最终更新根据下面巴巴尔和马库斯的回答,我做了一些更多的实验并解决了这个问题。亚当·鲍文 (Adam Bowen) 的评论是一个线索。我遗漏了两个关键事实:

  1. 我需要围绕我关心的几何中心进行缩放。
  2. 我需要以与直觉相反的顺序应用变换(对我来说)。

回想起来,第一个是显而易见的。但对于后者,对于像我这样的其他优秀程序员/糟糕数学家来说:事实证明我的直觉是在运作的Red Book https://rads.stackoverflow.com/amzn/click/com/0321552628称为“大固定坐标系”,其中有一个绝对平面,并且您的几何体使用变换在该平面上移动。这没关系,但考虑到将多个变换堆叠到一个矩阵背后的数学性质,这与实际工作方式相反(请参阅下面的答案或红皮书了解更多信息)。基本上,变换是按照它们在代码中出现的“相反顺序”“应用”的。这是最终的工作解决方案:

// source and dest are arbitrary rectangles.
float scaleX = dest.width / source.width;
float scaleY = dest.height / source.height;
Point sourceCenter = centerPointOfRect(source);
Point destCenter = centerPointOfRect(dest);

glTranslatef(destCenter.x, destCenter.y, 0.0);
glScalef(scaleX, scaleY, 0.0);
glTranslatef(sourceCenter.x * -1.0, sourceCenter.y * -1.0, 0.0);
// Draw geometry in question with its normal verts.

在 OpenGL 中,您指定的矩阵会与现有矩阵的右侧相乘,并且顶点位于表达式的最右侧。

因此,您指定的最后一个操作是在几何体本身的坐标系中进行的。 (第一个通常是视图变换,即相机到世界变换的逆。)

Bahbar 提出了一个很好的观点,即您需要考虑缩放的中心点。 (或旋转的枢轴点。)通常您会在那里平移,旋转/缩放,然后平移回来。 (或者一般来说,应用基础变换、运算,然后进行逆运算)。这就是所谓的基础变更 http://en.wikipedia.org/wiki/Change_of_basis,您可能想阅读。

无论如何,为了直观地了解它是如何工作的,请尝试使用一些简单的值(零等),然后稍微改变它们(可能是动画)并查看输出会发生什么。然后就可以更容易地看到变换对几何体的实际作用。

Update

该顺序是“颠倒”的。直觉在 OpenGL 初学者中相当普遍。我一直在辅导计算机图形学课程,许多人都有类似的反应。如果您在渲染变换和几何图形的树(场景图)时考虑使用pushmatrix/popmatrix,那么就更容易思考OpenGL 是如何做到这一点的。那么当前的事情秩序就会变得相当自然,反之则会使完成任何有用的事情变得相当困难。

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

OpenGL:缩放然后翻译?如何? 的相关文章

  • matplotlib:渲染到缓冲区/访问像素数据

    我想使用 matplotlib 生成的图作为 OpenGL 中的纹理 到目前为止 我遇到的 matplotlib 的 OpenGL 后端要么不成熟 要么已经停止使用 所以我想避免使用它们 我当前的方法是将图形保存到临时 png 文件中 并从
  • 如何为 glDrawElements() 指定每个图元的颜色

    我想渲染一个索引几何体 所以 我有一堆顶点和关联的排序索引 我在用glDrawElements 渲染 2 个四边形 如下所示 现在 我知道我可以使用glColorPointer 用于指定每个顶点的颜色 我的问题是 我可以指定吗每个基元的颜色
  • 渲染到一个颜色通道而不影响其他通道

    使用 OpenGL 任何版本 如何通过一次仅影响一个颜色通道来渲染到帧缓冲区对象 例如 我的帧缓冲区对象具有 GL BGRA 布局 现在我想执行一些渲染命令 这些命令应该只改变红色通道 因此 如果片段用颜色 204 0 0 0 渲染并且像素
  • 图像在 3D 空间中绕 Y 轴旋转

    我有一个 BufferedImage 我想用 theta 角而不是仿射变换绕 Java 中的 Y 轴旋转图像 图片 旋转将如下图所示 矩形将是图像 我可以通过旋转图像的每个像素并绘制图像来做到这一点 因为我必须旋转很多图像 所以我认为这不是
  • 无法在 QGLWidget 中设置所需的 OpenGL 版本

    我正在尝试在 Qt 4 8 2 中使用 QGLWidget 我注意到 QGLWidget 创建的默认上下文不显示 OpenGL 3 1 以上的任何输出 Qt wiki 有一个教程 http qt project org wiki How t
  • 如何创建具有倾斜效果的 NSAffineTransform?

    我对用 Cocoa 绘图还很陌生 并且正在开发一个涉及六边形网格的实验性应用程序 为了简化这个过程 我想倾斜坐标系 使 Y 轴向左旋转 30 度 我在苹果手机上看到了这个可可绘图指南 https developer apple com li
  • 为贝塞尔曲线中的每个点绘制切线

    我设法绘制了一条贝塞尔曲线 如下所示 glColor3f 0 1 0 glBegin GL LINE STRIP for int i 3 i lt nPt i 3 glColor3f 0 0 0 for float k 0 k lt NLI
  • Retina 显示屏中具有 QOpenGLWIdget 的 Qt MainWindow 显示错误大小

    我有一个 Qt 应用程序MainWindow 我嵌入一个QOpenGLWidget在里面 一切正常 直到我开始使用 Apple Retina 显示屏并在高 DPI 模式下运行我的应用程序 我的QOpenGLWidget只是它应该具有的大小的
  • 从主模块访问动态功能模块的可绘制文件夹中的图形

    我正在尝试动态模块拆分 API 交付 以便将我的游戏应用程序分解为即时版本和可安装版本 我一直在关注这里的 Codelabs 教程https codelabs developers google com codelabs on demand
  • SDL 程序中颜色关闭

    我目前正在开发一个非常简单的游戏 使用纯 C 方法和 SDL 及其官方额外库 如 SDL image 和 OpenGL 现在 虽然我遇到了一些障碍 但我不知道为什么要这样做 绘制时颜色全部关闭 我目前在 Mac 上运行该程序 但如果我没记错
  • 将渲染后效果应用于 XNA 中的 SpriteBatch

    在 XNA 框架中 有没有一种方法可以使用典型的 SpriteBatch 方法渲染 2D 场景 然后在渲染该帧后将效果应用于整个图像 例如 模糊 棕褐色甚至使整个事情看起来像旧电影胶片 带有颗粒 灰尘 线条等 是的 您要做的就是将渲染目标设
  • x11/xlib 与 Microsoft Visual C++

    我从维基百科复制粘贴这段代码 http en wikipedia org wiki Xlib http en wikipedia org wiki Xlib 我收到此错误 fatal error C1083 Cannot open incl
  • 如何在 R 中导入并绘制三角形网格?

    我想在 R 中绘制我的模型输出 它是格式为的三角形网格 x1 y1 z1 x2 y2 z2 x3 y3 z3 value 每行代表一个三角形 我想用以下方法绘制这些三角形value作为规模 mymesh lt structure c 0 9
  • 如何在 RSM (R) 中填充轮廓颜色并写入轴名称

    我有以下数据 ct lt structure list Conc c 50L 100L 150L 50L 100L 150L 50L 100L 150L 100L 100L 100L kGy c 10L 10L 10L 15L 15L 15
  • 3D 图形批处理

    很多网站 文章都说 批量 批 批 有人可以解释一下着色器中的 批处理 代表什么吗 即 是否 改变纹理 更改任意着色器变量 意味着某些东西不能 批处理 最简单的总结方法就是尝试尽可能少地调用 API 来绘制您需要绘制的内容 使用顶点数组或 V
  • Python tcl 未正确安装

    我刚刚为 python 安装了graphics py 但是当我尝试运行以下代码时 from graphics import def main win GraphWin My Circle 100 100 c Circle Point 50
  • 使用 WGL 创建现代 OpenGL 上下文?

    我正在尝试使用 Windows 函数创建 OpenGL 上下文 现代版本 基本上代码就是 创建窗口类 注册班级 创建一个窗口 choose PIXELFORMATDESCRIPTOR并设置它 创建旧版 OpenGL 上下文 使上下文成为当前
  • Libgdx SpriteBatch.draw() 指定 4 个顶点

    我正在使用 libGdx 创建一个 2d 游戏 并尝试使用这个特殊的方法来绘制一个简单的 2d 纹理 分别指定 4 个顶点 draw Texture texture float spriteVertices int offset int l
  • 磁模拟

    假设我在 n m 像素的 2D 表面上有 p 个节点 我希望这些节点相互吸引 使得它们相距越远吸引力就越强 但是 如果两个节点之间的距离 比如 d A B 小于某个阈值 比如 k 那么它们就会开始排斥 谁能让我开始编写一些关于如何随时间更新
  • 线性/非线性纹理映射扭曲的四边形

    In my 上一个问题 https stackoverflow com questions 10832909 quad strip texturing distortion 已经确定 当对四边形进行纹理化时 面被分解为三角形 并且纹理坐标以

随机推荐

  • 如何在 Flash 中为图块列表创建自定义单元格渲染器

    我需要实施一个自定义cell renderer在我的一个项目中 我在谷歌上进行了一些搜索 但找不到我需要的东西 我需要每一个cell in the tile list显示 2 个图标labels 我需要一个很好的例子来开始它 如果可能的话
  • 如何设置带有螺纹和不同精度的FFTW?

    我需要使用具有不同算术精度和多线程计划的 FFTW 我需要为所有精度设置多线程 像这样 fftwf init threads fftwf plan with nthreads nthreads fftw init threads fftw
  • MVC Identity 2.2.1 - 主键 (Guid) 作为 UniqueIdentifier 而不是 nVarChar(128)

    当前的项目 ASP NET 4 5 2 MVC 5 身份2 2 1 我遇到的问题之一是我在项目的其余部分中正确使用 GUID 数据库字段类型为 UniqueIdentifier 不幸的是 Identity 并不遵循相同的规则 并且由于某些难
  • Java - 信号量释放而不获取

    我有一些线程 它们被赋予随机数 1 到 n 并被指示按排序顺序打印它们 我使用信号量 这样我获取的许可证数量 随机数 并释放比获取的许可证多的许可证 获得 随机数 释放 1 随机数 信号量的初始许可计数为 1 因此随机数为 1 的线程应该获
  • 如何在界面生成器中对视图施加约束以满足 Xcode 8 中的所有 iphone 屏幕

    我一直在尝试以下内容 例如固定 纵横比 垂直间距 水平 垂直间距 前导 尾随间距 但对于 iPhone SE 及以上版本的所有 iPhone 屏幕 它并不能统一工作 您不再对每个设备应用约束 您可以为每个尺寸类别应用自动布局约束 如果您知道
  • 如何在前端js文件中安装、导入和使用DOMPurify?

    这更像是一个 您能否确认这是正确的 类型的问题 因为我认为我在编写问题的过程中解决了这个问题 但希望这对其他在这方面有点犹豫的人有帮助实施DOM纯化 https github com cure53 DOMPurify 简洁版本 进口和使用是
  • 在 C++ 中,传递给函数的指针的更改是否反映在调用函数中?

    如果我将指针P从函数f1传递给函数f2 并在f2中修改P的内容 这些修改会自动反映在f1中吗 例如 如果我需要删除链表中的第一个节点 void f2 Node p Node tmp p p p gt next delete tmp 对 P
  • 遮罩周围的 UIImage 边框

    我目前的代码是在我的上创建一个面具image http jeroendeleeuw com post 33638733049 how to mask images with core graphics in ios UIImage mask
  • 通过 openCSV 填充 Javabean - 代码解释

    我刚刚开始使用 Java 有很多缺失的知识 但我需要编写一个简单的类 它将使用 openCSV 将 csv 文件转换为 JavaBean 我在这里找到了类似问题的一些答案 但没有人能够帮助我 到目前为止 已经遇到过这段代码 ColumnPo
  • `$this->name` 和 `$this->$name` 有什么区别?

    我想知道有什么区别 this gt name and this gt name 也确实 this必须严格命名this或者它可以是任何东西吗 this是保留变量名 不能用于其他任何用途 它特别指出您当前正在使用的对象 您必须使用 this因为
  • 显示绝对值 angularjs

    我从 JSON 对象中得到一个负数 我想删除负数中的 只显示绝对值 收到json value 2 34 我想展示的内容 值为 2 34 您可以使用角度过滤器 js file angular module myApp filter makeP
  • Spring Security 中会话 cookie 的同站点标志

    是否可以设置同站 Cookie https datatracker ietf org doc html draft west first party cookies 07Spring Security 中的标志 如果没有 请问是否有增加支持
  • 手动将 RGB 转换为灰度

    我想手动将 RGB 图像转换为灰度图像 而无需在张量流中使用库 所以我写了以下内容 import tensorflow as tf import matplotlib image as mpimg import matplotlib pyp
  • 如何使 IPython 笔记本 matplotlib 绘图内联

    我正在尝试在 MacOS X 上使用带有 Python 2 7 2 和 IPython 1 1 0 的 IPython 笔记本 我无法让 matplotlib 图形内联显示 import matplotlib import numpy as
  • std::hardware_delta_interference_size 在哪里?

    看起来像std hardware destructive interference size未在 libc 或 libstdc 中定义 我已经 grep 了我的本地安装 我查看了各自的 svn 存储库 他们应该在
  • Git 重置不起作用

    我进行了一次提交 拉取并合并了一些更改 然后进行了第二次提交 当我想回到第一次提交时 我运行了命令 git reset hard
  • 使用 python 读取 MS Word 文件中的自定义文档属性

    如何使用 python 获取 MS Word 2010 文档的文档属性 对于文档属性 我指的是那些可以在文件 gt 信息 gt 属性 gt 高级属性下添加或修改的属性 在 MS WORD 2010 中 我在 windows764bit 上使
  • C++编译器允许循环定义吗?

    当我为树编写一些代码时犯了一个错误时 我遇到了以下奇怪的情况 我已经对这个示例进行了很多精简 因此它只是一个线性树 基本上 在 main 函数中 我想将一个节点附加到我的树上 但我没有将其附加到 tree root 而是仅将其附加到 roo
  • 接受语言列表

    我想对浏览器发送到网站的 Accept Language 做出反应 有谁知道我可以在哪里获得浏览器可能发送到网站的所有可用 Accept Languages 的可靠列表 非常感谢 IANA 语言子标签注册表页面 http www iana
  • OpenGL:缩放然后翻译?如何?

    我有一些二维几何 我想在我的几何体周围获取一些边界矩形 然后在平面上的其他地方渲染它的较小版本 以下或多或少是我必须进行缩放和翻译的代码 source and dest are arbitrary rectangles float scal