【问题标题】:Draw and Rotate an Arrow绘制和旋转箭头
【发布时间】:2021-01-27 22:26:17
【问题描述】:

我正在尝试使用下面的样式绘制箭头,但该箭头也应根据条件旋转(需要通过每个条件的度数)。我可以绘制矩形和三角形,但不能将三角形绘制为箭头。另外,如何将旋转度数包含在代码中?有没有更简单的方法来绘制箭头并旋转它?

int triangleRect=4, triangleTri=3, lineWidth=3;
double twicePi = 2.0f * M_PI, angle_offsetR =1.5* M_PI/2, radius = 0.05,
       xR=m_start.x(), y=m_start.y(), xT=m_start.x()+ m_rect_width;


glColor3f(0,1,0);
glLineWidth(lineWidth);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glEnable(GL_MULTISAMPLE);
glEnable(GL_POINT_SMOOTH);
glEnable(GL_LINE_SMOOTH);
glBegin(GL_TRIANGLE_FAN);

//RECTANGLE
for(int i = 0; i <= triangleRect; i++) {
    glVertex2f((xR + (radius * cos(i *  twicePi / triangleRect + angle_offsetR)))* m_parent_width_function(),
               (y + (radius * sin(i * twicePi / triangleRect + angle_offsetR)))* m_parent_height_function());
}
// TRIANGLE
for(int i = 0; i <= triangleTri; i++) {
    glVertex2f((xT + (radius * cos(i * twicePi / triangleTri + angle_offsetR)))* m_parent_width_function(),
               (y + (radius * sin(i * twicePi / triangleTri + angle_offsetR)))* m_parent_height_function());
}

glEnd();

【问题讨论】:

  • glRotatef() 由于某种原因无法正常工作?
  • 我已经包含 glRotatef(45.0f, 0.0f, 1.0f, 1.0f); glTranslatef(0.0f, 0.0f, -100.0f);在 glBegin 之后,但我看不到任何变化。我正在尝试上下旋转箭头。我不确定我做错了什么。

标签: c++ qt opengl opengl-compat


【解决方案1】:

您不小心将angle_offsetR 添加到三角形向量的角度。此外,当您绘制新形状时,您必须重新启动 GL_TRIANGLE_FAN primitiv(请参阅 Triangle primitives)。
如果要旋转模型,则通过glRotatef 将围绕z 轴的旋转添加到模型视图矩阵。
不要平移和缩放顶点坐标。使用glScaleglTranslate。矩阵变换不是commutative,顺序很重要:

float angle_of_roation = 30.0; // 30°
glPushMatrix();
// scale
glScalef( m_parent_width_function(), m_parent_height_function(), 1.0f);
// move triangle and rectangle to the position in the world
glTranslatef(xR, y, 0.0f);
// roatate triangle and rectangle
glRotatef(angle_of_roation, 0, 0, 1);
              
//RECTANGLE
glBegin(GL_TRIANGLE_FAN);
for(int i = 0; i <= triangleRect; i++) {
    float angle = i * twicePi / triangleRect + angle_offsetR;
    glVertex2f(radius * cos(angle), radius * sin(angle));
}
glEnd();

glPushMatrix();
// translate triangle relative to rectangle
glTranslatef(xT-xR, 0.0f, 0.0f); 
    
// TRIANGLE
glBegin(GL_TRIANGLE_FAN);
for(int i = 0; i <= triangleTri; i++) {
    float angle = i * twicePi / triangleTri;
    glVertex2f(radius * cos(angle), radius * sin(angle));
}
glEnd();

glPopMatrix();
glPopMatrix();

【讨论】:

  • 非常感谢。现在代码完美地绘制了箭头。我输入 45 度作为 glRotatef(45.0, 0, 0, 1);但我看不到任何变化。我想知道你是否知道为什么?
  • 是的,就像 glPushMatrix(); glRotatef(angle_of_rotation, 0, 0, 1); glBegin(GL_TRIANGLE_FAN);但这根本不画箭头。如果我只在 glBegin 之后写 glRotatef() 它会绘制形状。
  • @Elf glRotatefglBegin 之后无效,因为它是非法的。在glBeginglEnd 之间只允许查看指令。我会在答案中添加一些建议。
  • 非常感谢!代码看起来很棒,也很完美!感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-07-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多