OpenGL 旋转 2D 纹理

2024-01-04

UPDATE

更新见底部。


我在互联网上查找了很多,发现了一些教程来解释我想要实现的目标,但我无法让它工作,要么教程不完整,要么不适用于我的代码。

我正在尝试一些简单的事情,例如围绕其原点(中心)旋转二维图像。

我使用 xStart、xEnd、yStart 和 yEnd 来翻转 0 或 1 的纹理。

这就是代码的样子

GameRectangle dest = destination;
Vector2 position = dest.getPosition();

glEnable(GL_TEXTURE_2D);

glBindTexture(GL_TEXTURE_2D, this->image);

//If the rotation isn't 0 we'll rotate it
if (rotation != 0)
{
    glMatrixMode(GL_TEXTURE);

    glLoadIdentity();
    glTranslatef(0.5, 0.5, 0);
    glRotatef(rotation, 0, 0, 1);

    glMatrixMode(GL_PROJECTION);
}

glBegin(GL_QUADS);
glTexCoord2d(xStart,yStart);
glVertex2f(position.x, position.y);

glTexCoord2d(xEnd,yStart);
glVertex2f(position.x + this->bounds.getWidth(), position.y);

glTexCoord2d(xEnd,yEnd); 
glVertex2f(position.x + this->bounds.getWidth(), position.y + this->bounds.getHeight());

glTexCoord2d(xStart,yEnd);
glVertex2f(position.x, position.y + this->bounds.getHeight());

glEnd();

glDisable(GL_TEXTURE_2D);

//Reset the rotation so next object won't be rotated
glMatrixMode(GL_TEXTURE);

glLoadIdentity();
glRotatef(0, 0, 0, 1);

glMatrixMode(GL_PROJECTION);

此代码将以原始大小绘制图像并旋转它,但它会从左上角旋转它,这会大量裁剪图像。通过调用 GameRectangle.getOrigin() 我可以轻松获取矩形的中心,但我不知道在哪里使用它。

如果放置位:

 glTranslatef(-0.5, -0.5, 0);

我打电话后:

 glRotatef(0.5, 0.5, 0);

它会从中心旋转,但如果不是完美的 90 度旋转,它会拉伸图像。

UPDATE


在尝试了几乎所有可能的方法之后,我得到了我想要的结果。

但我不确定这是否是最好的方法。请告诉我我的代码是否有问题。

正如我在上面的评论中提到的,我多次使用同一图像并使用不同的值绘制它,所以我无法将任何内容保存到实际图像中。所以每次渲染后我都必须重置这些值。

我将我的代码更改为:

//Store the position temporary
GameRectangle dest = destination;
Vector2 position = dest.getPosition();

glEnable(GL_TEXTURE_2D);

glBindTexture(GL_TEXTURE_2D, this->image);

glTranslatef(dest.getOrigin().x, dest.getOrigin().y, 0);
glRotatef(rotation, 0, 0, 1);

glBegin(GL_QUADS);
glTexCoord2d(xStart,yStart);
glVertex2f(-dest.getWidth()/2, -dest.getHeight()/2);

glTexCoord2d(xEnd,yStart);
glVertex2f(dest.getWidth()/2, -dest.getHeight()/2);

glTexCoord2d(xEnd,yEnd); 
glVertex2f(dest.getWidth()/2, dest.getHeight()/2);

glTexCoord2d(xStart,yEnd);
glVertex2f(-dest.getWidth()/2, dest.getHeight()/2);

glEnd();

//Reset the rotation and translation
glRotatef(-rotation,0,0,1);
glTranslatef(-dest.getOrigin().x, -dest.getOrigin().y, 0);

glDisable(GL_TEXTURE_2D);

这会将纹理与其绘制的四边形一起旋转,它不会拉伸或裁剪。然而,如果图像填充为正方形,边缘会有点锯齿状,但我想如果不使用抗锯齿功能就无法避免这种情况。


你想要的是这样的:

glPushMatrix(); //Save the current matrix.
//Change the current matrix.
glTranslatef(dest.getOrigin().x, dest.getOrigin().y, 0);
glRotatef(rotation, 0, 0, 1);

glBegin(GL_QUADS);
glTexCoord2d(xStart,yStart);
glVertex2f(-dest.getWidth()/2, -dest.getHeight()/2);

glTexCoord2d(xEnd,yStart);
glVertex2f(dest.getWidth()/2, -dest.getHeight()/2);

glTexCoord2d(xEnd,yEnd); 
glVertex2f(dest.getWidth()/2, dest.getHeight()/2);

glTexCoord2d(xStart,yEnd);
glVertex2f(-dest.getWidth()/2, dest.getHeight()/2);

glEnd();

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

OpenGL 旋转 2D 纹理 的相关文章

随机推荐

  • MIT方案中的异常处理

    如何在 MIT 方案中引发和处理异常 类似于 它不起作用 lt val 0 raise ve value 该文档确实提供了答案 但没有代码示例 因此这里是一个 define handler x display Handling Error
  • ASP.NET Windows 身份验证

    我需要什么设置才能完成以下任务 IIS6 服务器位于 Domain1 上 用户从Domain2访问 例如Domain2 User I want WindowsIdentity ident WindowsIdentity GetCurrent
  • strings.xml 中的百分比符号

    我正在尝试格式化 string xml 中的字符串以将其与多个值一起重用 我遇到了一些问题 因为字符串还应该包含格式化程序使用的百分比符号 我已经尝试用 Unicode 表示形式替换 符号 但这似乎不起作用
  • 如果 Pandas DataFrame 列是不同长度的字符串,如何将其拆分为多个列?

    我有一个 Pandas DataFrame 它是通过使用 tabula 从 PDF 中读取表格而创建的 PDF 没有被完美解析 因此我最终将一些表列挤进了生成的 DataFrame 中的一列中 问题在于 PDF 中的表列之一是文本 因此有时
  • CSS3 背景图像放置

    我正在创建一个简单的占位符页面来宣布一个新网站 该页面仅包含 居中的背景徽标图像 该图像正下方的 流行语 我认为这很容易 我放置一个指定尺寸的定位背景图像 然后放置一个绝对定位的h1标题以获取背景图像正下方的 流行语 color white
  • Apache Spark 在内存中如何工作?

    当在 where 子句中使用非索引列查询 Cassandra 时 Spark Cassandra Connector 的官方文档 https github com datastax spark cassandra connector blo
  • pyqt QFileSystemModel rowCount

    我看过有关 QFileSystemModel rowCount 未按预期工作的帖子 ex1 https stackoverflow com questions 33544645 qfilesystemmodel rowcount does
  • document.write 是否阻塞

    我想以阻塞方式将脚本插入页面 不幸的是 无法使用脚本标记的 src 属性 如果我在所有浏览器上通过 document write 插入标签 它会阻塞吗 我知道这是一种不好的做法 但我确实需要它来阻止其他资源的加载 目前我正在做 docume
  • iOS9 - 分享到 Instagram(带钩子)不起作用

    我目前正在更新我的一款应用程序以兼容 iOS9 但在分享到 Instagram 功能时遇到问题 我正在使用 Instagram hooks 如他们的开发者网站上所述 https instagram com developer mobile
  • 重读 Lucene TokenStream 时遇到问题

    我正在使用 Lucene 4 6 并且显然不清楚如何重用 TokenStream 因为我得到了异常 java lang IllegalStateException TokenStream contract violation reset c
  • 将字符串文字添加到 static_assert

    有没有办法结合 static assert 的输出 我的意思是这样的 template
  • v4l2_buffer->timestamp值从哪里开始计数?

    我正在尝试使用 v4l2 buffer 的时间戳值 类型 timeval 来同步从UVC网络摄像头到外部事件 但是时间戳与系统时间或正常运行时间等不同 printf image captured at ld ld n buffer gt t
  • IE8和JQuery的trim()

    我正在像这样使用trim if group field val trim Where group field是文本类型的输入元素 这在 Firefox 中有效 但当我在 IE8 上尝试时 出现以下错误 Message Object does
  • Spring Data MongoDB 和allowDiskUse

    我有一个这样的查询 db tqaP aggregate match and eventUTCDate gte 01 10 2014 eventUTCDate
  • Android 浏览器意图后退按钮

    您好 我正在使用以下意图从我的应用程序启动浏览器 String url XXXX Intent i new Intent Intent ACTION VIEW i setData Uri parse url startActivity i
  • 什么时候使用 hr 元素在语义上是正确的?

    The HTML5 参考 http dev w3 org html5 html author the hr element说 hr 元素代表段落级主题中断 例如故事中的场景变化 或参考书中某个部分中到另一个主题的过渡 这个描述对我来说还不够
  • x32 与 x64 的库名称

    我有一个支持 x32 和 x64 平台的 C 静态库 我的问题是 我应该根据哪个平台对 lib 文件命名不同吗 即 MyLib32 lib 与 MyLib64 lib 英特尔数学库和 TBB 使用文件夹名称来区分这两个库来处理此问题 即 x
  • jQuery 和 CSS 媒体查询之间的窗口宽度不一致

    我在这里得到了一些奇怪的结果 我不太明白 在 jQuery 中 我通过以下方式记录窗口宽度 console log window width 在我的 CSS 中 我将背景颜色更改为红色 media only screen and min w
  • 在python中从网上下载excel文件

    我有以下网址 dls http www muellerindustries com uploads pdf UW SPD0114 xls 我尝试下载该文件 urllib2 urlopen dls test xls 这创建了一个名为 test
  • OpenGL 旋转 2D 纹理

    UPDATE 更新见底部 我在互联网上查找了很多 发现了一些教程来解释我想要实现的目标 但我无法让它工作 要么教程不完整 要么不适用于我的代码 我正在尝试一些简单的事情 例如围绕其原点 中心 旋转二维图像 我使用 xStart xEnd y