Opengl圆形旋转

时间:2017-09-24 19:34:42

标签: c++ opengl graphics2d

我想为太阳周围的光线创建一个圆形旋转。

image

让它看起来像这样 image

我如何在画布上绘制曲线。

GLfloat ctrlpoints[4][3];

void drawCurves(float x1,float y1,float x2,float y2,float x3,float y3,float x4,float y4) {

    ctrlpoints[0][0]=x1;
    ctrlpoints[0][1]=y1;
    ctrlpoints[0][2]=50.0f;
    ctrlpoints[1][0]=x2;
    ctrlpoints[1][1]=y2;
    ctrlpoints[1][2]=50.0f;
    ctrlpoints[2][0]=x3;
    ctrlpoints[2][1]=y3;
    ctrlpoints[2][2]=50.0f;
    ctrlpoints[3][0]=x4;
    ctrlpoints[3][1]=y4;
    ctrlpoints[3][2]=50.0f;

    glMap1f(GL_MAP1_VERTEX_3, 0.0, 1.0, 3, 4, &ctrlpoints[0][0]);
    glEnable(GL_MAP1_VERTEX_3);
    int i;
    glLineWidth(3.0f);
    //glColor3f(0.0f, 0.0f, 0.0f);
    glBegin(GL_LINE_STRIP);
      for (i = 0; i <= 30; i++) 
         glEvalCoord1f((GLfloat) i/30.0);

    glEnd();
}

如何制作光线。

void Ray (float x, float y, float s){

     glColor3f(1, 1, 0);
     drawCurves(x, y, x+4*s, y-7*s, x-6*s, y-27*s, x-3*s, y-30*s);
     glColor3f(1, 1, 0);
     drawCurves(x, y, x+7*s, y-7*s, x+1*s, y-27*s, x+4*s, y-30*s);
}       

我如何设计太阳动机。

void Rays(float x, float y, float radius, int num_segments){
    float i;
    double twicePi = 2.0 * 3.142;
    for (i = 0; i <= num_segments; i++)   {

        Ray((x+ (radius * cos((i * twicePi / num_segments))))
             ,(y + (radius * sin((i * twicePi / num_segments))))
             ,0.3);
    }
}

尝试glRotation,但它会旋转整个旗帜,我只想旋转光线。

1 个答案:

答案 0 :(得分:1)

您必须计算 ray 的方向,并且必须在光线方向上设置曲线的点。在计算机图形中,旋转通常由矩阵计算。但由于这是一个简单的2D图形,并且您已经编写了大部分代码,因此可以在没有矩阵的情况下完成计算。

您必须计算光线的方向和逆时针旋转的正交方向。这2个方向是单个射线几何形状的局部x轴和局部y轴。必须沿此轴绘制光线曲线的坐标。

void Rays(float x, float y, float radius, int num_segments)
{
    const float twicePi = 2.0f * 3.141593f;
    for (int i = 0; i <= num_segments; ++i)
    {
        float angle = (float)i * twicePi / num_segments;
        float dir_x = sin( angle );
        float dir_y = cos( angle );
        Ray( dir_x, dir_y, radius, 0.3 );
    }
}

float dot( float a[], float b[2] )
{
  return a[0]*b[0] + a[1]*b[1];
}

void Ray ( float xx, float xy, float r, float l)
{
    float yx = -xy, yy = xx; // (xx, xy) counterclockwise rotated = (-xy, xx)

    float xc[]{ xx, yx };
    float yc[]{ xy, yy };

    float p0[]{     xx * r,    xy * r };
    float p1[]{  -7.0f * s,  4.0f * s };
    float p2[]{ -27.0f * s, -6.0f * s };
    float p3[]{ -30.0f * s, -3.0f * s };
    float p4[]{  -7.0f * s,  7.0f * s };
    float p5[]{ -27.0f * s,  1.0f * s };
    float p6[]{ -30.0f * s,  4.0f * s };

    glColor3f(1, 1, 0);
    drawCurves(
        p0[0], p0[1], 
        p0[0] + dot(xc, p1[0]), p0[1] + dot(yc, p1[1]),
        p0[0] + dot(xc, p2[0]), p0[1] + dot(yc, p2[1]),
        p0[0] + dot(xc, p3[0]), p0[1] + dot(yc, p3[1]) );
    drawCurves(
        p0[0], p0[1], 
        p0[0] + dot(xc, p4[0]), p0[1] + dot(yc, p4[1]),
        p0[0] + dot(xc, p5[0]), p0[1] + dot(yc, p5[1]),
        p0[0] + dot(xc, p6[0]), p0[1] + dot(yc, p6[1]) );
}