【问题标题】:Rotate Triangle In OpenGL在OpenGL中旋转三角形
【发布时间】:2012-02-02 10:44:51
【问题描述】:

我正在尝试围绕它的中心点旋转一个三角形。我知道 OpenGL 围绕原点旋转,所以我需要将中间点平移到原点,然后旋转,然后平移回来。我已经注释掉了最后一行,以确保它至少围绕原点的中心旋转。它不是。尽管进行了翻译,但它似乎围绕其旧起源旋转...请注意 ccc4 和 ccp 生成浮点数。这是我的代码:

ccColor4B colors[] = {
    ccc4(255, 0, 0, 255),
    ccc4(0, 255, 0, 255),
    ccc4(0, 0, 255, 255)
};

CGPoint vertices[] = {
    ccp(0,0),
    ccp(50,100),
    ccp(100,0),
};

CGPoint middle[] = {ccp(50,50)};
CGPoint origin[] = {ccp(0,0)};

// Rotate the triangle
glPushMatrix();
glTranslatef(-50, -50, 0);
glRotatef(45, 0, 0, 1.0);
// glTranslatef(50, 50, 0);

// Draw the triangle
glLineWidth(2);
glVertexPointer(2, GL_FLOAT, 0, vertices);
glColorPointer(4, GL_UNSIGNED_BYTE, 0, colors);
glColor4ub(0, 0, 255, 255);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 3);

// Revert rotation, we only want triangle to rotate 
glPopMatrix();

// Draw the points
glDisableClientState(GL_COLOR_ARRAY);

glPointSize(5);
glColor4ub(255, 255, 255, 255);
glVertexPointer(2, GL_FLOAT, 0, middle);
glDrawArrays(GL_POINTS, 0, 1);

glPointSize(5);
glColor4ub(0, 255, 0, 255);
glVertexPointer(2, GL_FLOAT, 0, origin);
glDrawArrays(GL_POINTS, 0, 1);

glEnableClientState(GL_COLOR_ARRAY);
// End points

这是输出:

【问题讨论】:

  • 我注意到我的三角形甚至不是等边的。我一直得到 sqrt(3)/6 作为等边的中心点......
  • 你会碰巧有证明的链接吗?
  • @AramKocharyan:对不起,我给了你一个流浪汉。那是三角形的高度,而不是中心。根据 Vyktor 的评论,该中心在 y 轴上仅为 1/3。

标签: opengl rotation


【解决方案1】:

您需要将转换视为与调用它们的顺序相反的应用。

实际上,从变换局部坐标系 (LCS) 而非对象的角度考虑更容易,这样您就可以按照调用顺序在脑海中应用变换。要绕中心旋转,请将 LCS 平移到中心,旋转,然后再将其平移回来:

glTranslatef(50, 50, 0);
glRotatef(45, 0, 0, 1);
glTranslatef(-50, -50, 0);

【讨论】:

  • 干杯!我会记得以这种心态思考。现在说得通了。在 LCS 上抽签意味着以后的抽签也在这个 LCS 上。
  • @AramKocharyan:没错。这也意味着后来的transforms是wrt LCS。例如,假设您从身份转换开始,然后调用glScale(20, 20, 20),然后调用glRotate(45, 0, 0, 1)。如果您随后调用glTranslate(1, 0, 0),LCS 将相对于世界沿对角线向上和向右移动 20 个单位。
  • 感谢 Marcelo 的例子,这也很有意义。
  • 您是否知道为什么缩放和旋转会产生与旋转和缩放不同的结果?
  • @AramKocharyan:除非您在两者之间进行另一次变换,或者每个轴的比例因子不同,否则应该没有任何区别。乘以每个维度具有相同比例因子的比例矩阵相当于乘以一个标量,这是可交换的(即,glScale(f, f, f) 可以出现在转换链中的任何位置)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-02
  • 1970-01-01
  • 1970-01-01
  • 2012-11-12
  • 1970-01-01
相关资源
最近更新 更多