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:缩放然后翻译?如何? 的相关文章

  • 如何用opengl制作2D地形?

    我想制作一个简单的二维地形 只有一些颠簸和高度变化 我想过只使用随机数来描述某个顶点的高度 但我不知道如何从中制作一个网格 我正在寻找一种方法来查找地形的顶点和索引缓冲区 我该怎么做呢 您可以仅将 GL POLYGON 与所有顶点的列表一起
  • 如何在pdf中导出一对一的JTable[重复]

    这个问题在这里已经有答案了 可能的重复 为什么 JTable 标题没有出现在图像中 https stackoverflow com questions 7369814 why does the jtable header not appea
  • 哪个 Haskell 计算机图形几何库?

    我想用 Haskell 做一些计算机图形学实验 这将包括进行一些几何计算并最终编写光线追踪器 我应该选择哪个库来轻松处理向量 矩阵及其相关操作 Hackage 上很少有包括像这样好看的vect http hackage haskell or
  • QOpenGLFunctions 缺少重要的 OpenGL 函数

    QOpenGLFunctions 似乎缺少重要的函数 例如 glInvalidateFramebuffer 和 glMapBuffer 据我了解 QOpenGLFunctions 加载桌面 OpenGL 函数和 ES 函数的交集 如果是这样
  • OpenGL:调试“单通道线框渲染”

    我正在尝试实现论文 单通道线框渲染 它看起来很简单 但它给了我所期望的厚暗值 论文没有给出计算海拔高度的确切代码 所以我按照自己认为合适的方式进行了操作 代码应该将三个顶点投影到视口空间中 获取它们的 高度 并将它们发送到片段着色器 片段着
  • 为什么我的 FPS 相机一劳永逸地滚动?

    如果我忽略四元数代数的肮脏细节 我想我理解了旋转和平移变换背后的数学 但仍然不明白我做错了什么 为什么我的相机一劳永逸地滚动 更具体地说 我应该如何从相机的方向 旋转矩阵 计算相机视图矩阵 我正在用 Python 编写一个简约的 3d 引擎
  • openGL转png

    我正在尝试将包含大量纹理 没有移动 的 openGL 编辑 我画的卡片 thx unwind 转换为一个 PNG 文件 我可以在框架的另一部分中使用该文件我正在与 有 C 库可以做到这一点吗 thanks 如果您的意思只是 获取由 Open
  • glEnableVertexAttribArray 中“index”参数的含义以及(可能)OS X OpenGL 实现中的错误

    1 我是否正确理解 要使用顶点数组或VBO进行绘制 我需要所有属性在着色器程序链接之前调用glBindAttribLocation 或者在着色器程序成功链接后调用glGetAttribLocation 然后使用glVertexAttribP
  • 在 Safari 中转换变换和大小 (9.1)

    我试图在元素上实现平滑过渡transform translate 和一些其他属性 是的 我读过有关匹配供应商前缀的内容 它在 Chrome 和 FF 中工作正常 但在 Safari 中它不能平滑地动画转换 在最后跳转 在应用翻译之前 它似乎
  • 将像素传递给 glTexImage2D() 后会发生什么?

    例如 如果我创建一个像素数组 如下所示 int getPixels int pixels new int 10 pixels 0 1 pixels 1 0 pixels 1 1 etc glTexImage2D getPixels glTe
  • 使用 OpenGL 着色器进行数学计算 (C++)

    我有一个矩阵 例如 100x100 尺寸 我需要对每个元素进行计算 matrix i j tt 8 5例如 我有一个巨大的矩阵 我想使用 OpenGL 着色器来实现该算法 我想使用着色器 例如 uniform float val unifo
  • 如何从傅里叶变换绘制频谱

    我想绘制音乐文件的频谱 就像他们在 Audacity 中所做的那样 因此 我希望 x 轴上以赫兹为单位的频率 y 轴上以振幅 或 desibel 为单位 我将歌曲 大约 2000 万个样本 分成一次 4096 个样本的块 这些块将产生 20
  • 如何在ggplot2中使用希腊符号?

    我的类别需要用希腊字母命名 我在用ggplot2 并且它与数据配合得很好 不幸的是 我无法弄清楚如何将这些希腊符号放在 x 轴上 在刻度线处 并使它们出现在图例中 有什么办法可以做到吗 更新 我看了一下link https github c
  • 如何在 GTX 560 及更高版本上使用 OpenGL 进行立体 3D?

    我正在使用在 Windows 7 上运行的开源触觉和 3D 图形库 Chai3D 我重写了该库以使用 Nvidia nvision 执行立体 3D 我将 OpenGL 与 GLUT 一起使用 并使用 glutInitDisplayMode
  • 如果我用opengl绘图的话SDL Renderer就没用了吗?

    我正在学习 SDL2 但我也在使用使用 OpenGL 调用的 imgui 库 从我在网上各种博客上读到的内容来看 我无法轻松混合 SDL2 渲染器和 opengl 调用 我要么使用其中之一 要么使用另一个 我读过的大多数教程都使用渲染器 所
  • 当 OpenGL 中同时绑定 1D 和 2D 纹理时,正确的行为是什么?

    假设你有这样的东西 glBindTexture GL TEXTURE 2D my2dTex glBindTexture GL TEXTURE 1D my1dTex glBegin 正确的 OpenGL 行为是什么 要绘制一维纹理 二维纹理还
  • 预乘 Alpha 合成

    我正在尝试实现预乘阿尔法混合 在本页 什么是颜色混合 https learn microsoft com en us previous versions windows xna bb976070 v xnagamestudio 41 它们确
  • 将带有 glut 的点击坐标添加到向量链接列表中

    我想创建一个向量链接列表 并在 GLUT 库的帮助下获取点击的位置并将它们附加到链接列表中 这些是我写的结构 typedef struct vector int x int y Vector typedef struct VectorLis
  • OpenGL - 两个纹理的幂

    OpenGL 使用二次幂纹理 这是因为由于 MipMapping 某些 GPU 只接受 2 的幂纹理 当绘制比实际更大的纹理时 使用这些二次方纹理会导致问题 我想到了一种方法来解决这个问题 即仅在我们使纹理小于实际大小时使用 PO2 比率
  • IE9-11 检测变换样式:preserve-3d

    我为一个项目制作了一个 3d 类型的菜单 自然 IE 会引起问题 因为 IE10 即使 3d 变换工作 也不支持变换样式 preserve 3d 我尝试了解决方法 通过对 3d 菜单容器的每个子元素应用变换 但至少可以说 动画看起来很糟糕

随机推荐

  • 如何在 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