【问题标题】:Can I obtain the vertices of a square after rotating it with OpenGL?用OpenGL旋转后,我可以得到一个正方形的顶点吗?
【发布时间】:2015-06-28 02:28:09
【问题描述】:

我有以下声明:

glBegin( GL_QUADS );
glColor3f(0.0f,0.7f,0.7f);
glVertex2f(x1,y1);
glVertex2f(x2,y2);
glVertex2f(x3,y3);
glVertex2f(x4,y4);
glEnd();

问题是:如果我应用旋转,比如说 20 度,那么我怎么知道这些顶点在哪里? 因为稍后我需要能够点击方格并确定我点击的位置是否确实在方格内。

【问题讨论】:

  • 你不能在 CPU 上对你的顶点做同样的转换吗?一般来说,弄清楚“点击了什么”是一个棘手的问题,在文献中有不同的解决方案(射线三角形相交,使用不同的颜色绘制所有内容,然后用于查找等)。获取顶点/after/顶点变换的问题也很棘手;现代 OpenGL 允许您通过 Transform Feedback 来实现,但您的代码是 OpenGL 1.x-ish,所以忘记这一点。
  • “在 CPU 上对顶点进行相同的转换”是什么意思? @佩佩
  • 这里的问题是您使用的是非常老式的 OpenGL(2 或更早版本)。现代 OpenGL 有变换反馈和其他好东西。要在 CPU 端进行转换,您可以根据需要使用 glm 之类的库。

标签: c++ opengl glut


【解决方案1】:

虽然我希望在这个千年中没有人使用过它,但实际上有一种机制可以在旧版 OpenGL 中获取转换的顶点。它被称为“反馈模式”。详细解释它超出了答案的范围。但是,如果您想了解它是如何工作的,您可以在免费提供的Red Book 在线版本中阅读它。

您在问题中谈到的“点击并识别”通常称为“挑选”或“选择”。实现它的方法有很多,选择哪种方法在一定程度上取决于您的应用程序。让您快速了解一些常用方法:

  • 选择模式。这几乎和反馈模式一样过时了。它一样旧,但我感觉它至少更常用,所以它可能有更好的支持。不过,我不建议在新代码中使用它。同样,如果您想了解它,可以在Red Book中找到解释。

  • 现代 OpenGL 有一个称为变换反馈的功能。虽然其主要用途不同,但它可用于回读转换后的顶点,类似于旧版反馈模式。

  • 将场景绘制到屏幕外缓冲区,每个对象都以不同的颜色呈现。然后读回选择位置的颜色,并将其映射到一个对象。这是一种相当优雅且高效的方法,如果适合您的要求,可以推荐。

  • 在 CPU 上使用您自己的代码执行计算。与转换所有对象不同,更有效的方法通常是将逆变换应用于您的拾取点(实际上变成了一条射线),并将其与几何体相交。

【讨论】:

  • 我将此标记为解决方案,因为它实际上提供了解决问题的方法。不过,最后我没有实现这个功能。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-11-06
  • 2011-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多