来自选定像素的波浪(openGL C++)

vhmi4jdf  于 2022-11-04  发布在  其他
关注(0)|答案(1)|浏览(104)

我已经创建了一个程序,绘制一个挥舞的旗帜,我想添加一个功能,将创建新的波选定的像素,但我不能让它开始在我想让它开始,甚至使旗帜停止挥舞(可能是因为同步的罪恶)。
这是我的显示函数。

const int W = 800;
const int H = 600;
// simulates Frame Buffer
unsigned char pixels[H][W][3] = { 0 }; // 3 is for RGB
    void display()
    {
        glClear(GL_COLOR_BUFFER_BIT); // clean frame buffer

        createFlag();
        int i, j;
        double dist;
        offset += 0.25;
        for (i = 0; i < H; i++)
            for (j = 0; j < W; j++)
            {
                dist = sqrt(pow(i + H / 2.0, 2) + pow(j + W / 2.0, 2));
                pixels[i][j][0] += 135 + 55 * (1 + 1 * sin(dist / 25 - offset)) / 2; // red
                pixels[i][j][1] += 135 + 85 * (1 + 1 * sin(dist / 25 - offset)) / 2; // green
                pixels[i][j][2] += 135 + 105 * (1 + 1 * sin(dist / 25 - offset)) / 2; // blue

            }
        // draws the matrix pixels
        glDrawPixels(W, H, GL_RGB, GL_UNSIGNED_BYTE, pixels);

        glutSwapBuffers(); // show all
    }

这是我的鼠标功能。

void mouse(int button, int state, int x, int y)
{
    if (button == GLUT_LEFT_BUTTON && state == GLUT_DOWN)
    {
        double dist;
        offset += 0.1;
        for (y = 0; y < H; y++)
            for (x = 0; x < W; x++)
            {
                dist = sqrt(pow(H/2.0 -(H - y), 2) + pow(W/2.0 -x, 2)); //problem is prob. here
                pixels[y][x][0] += 135+ 55 * (1 + 1 * sin(dist / 50.0 - offset)) / 2; // red
                pixels[y][x][1] += 135+ 85 * (1 + 1 * sin(dist / 50.0 - offset)) / 2; // green
                pixels[y][x][2] += 135+105 * (1 + 1 * sin(dist / 50.0 - offset)) / 2; // blue
                if (offset < 0.3)
                    offset += 0.05;
            }
    }
}
px9o7tmv

px9o7tmv1#

以下是我看到的几点:

  • 在你的鼠标函数中,你没有使用参数xy,它们是你点击鼠标的位置,而是创建了局部变量xy。如果你想从你点击的像素开始一个波,你必须把你的dist居中到这个点,所以代码的想法可以是(受GLUT mouse button down的启发):
void mouse(int button, int state, int x, int y)
{
    // save the left button state
    if (button == GLUT_LEFT_BUTTON)
    {
        leftMouseButtonDown = (state == GLUT_DOWN);
    }

    // save the mouse position
    mouseXPos = x;
    mouseYPos = y;
}

void display()
{
    glClear(GL_COLOR_BUFFER_BIT); // clean frame buffer

    createFlag();
    double dist;
    offset += 0.25;
    for (i = 0; i < H; i++)
        for (j = 0; j < W; j++)
        {
            dist = sqrt(pow(i + H / 2.0, 2) + pow(j + W / 2.0, 2));
            pixels[i][j][0] += 135 + 55 * (1 + 1 * sin(dist / 25 - offset)) / 2; // red
            pixels[i][j][1] += 135 + 85 * (1 + 1 * sin(dist / 25 - offset)) / 2; // green
            pixels[i][j][2] += 135 + 105 * (1 + 1 * sin(dist / 25 - offset)) / 2; // blue
        }

    if (leftMouseButtonDown)   // the way you can get leftMouseButtonDown depends on your 
                               // configuration of your different files 
                               // (main.cpp, scene.cpp, ...)
        new_wave() ; //see below

    // draws the matrix pixels
    glDrawPixels(W, H, GL_RGB, GL_UNSIGNED_BYTE, pixels);

    glutSwapBuffers(); // show all
}

void new_wave()
{
    x = mouseXPos ;   // same remark as leftMouseButtonDown 
    y = mouseYPos ;
    offset = 0.1;
    for (i = 0; i < H; i++)     // i and not y
        for (j = 0; j < W; j++)
        {
            dist = sqrt(pow(i - y, 2) + pow(j - x, 2));    // change here
            pixels[i][j][0] += 135+ 55 * (1 + 1 * sin(dist / 50.0 - offset)) / 2; // red
            pixels[i][j][1] += 135+ 85 * (1 + 1 * sin(dist / 50.0 - offset)) / 2; // green
            pixels[i][j][2] += 135+105 * (1 + 1 * sin(dist / 50.0 - offset)) / 2; // blue
            if (offset < 0.3)
                offset += 0.05;   
// I don't really get what you do here with the offset, but another parameter to
// play with could be the amplitude of this wave that starts from the point 
// you clicked, like when a drop falls on water
        }
}
  • 如果你想要一个实时挥动的旗帜,你必须把时间作为你的像素颜色值的参数
  • 我还没有测试过它,但是我不确定openGL对超过255的RGB着色的React,这在你的情况下发生,如果你仍然有错误的话,也许记住这一点
  • dist = sqrt(pow(i + H / 2.0, 2) + pow(j + W / 2.0, 2));这是在(-W/2.0, -H/2.0)的中心,这是你想要的吗?(也许是的,只是想确保,如果你想模拟一些风,你可以设置风的原点在你想要的地方,这是你在这里做的)
  • 显示中的int i, j;没有用(只是为了清除一些代码)

这是我自己的一些评论,这段代码可能不会是你的最后一段。如果我误解了你的目标,或者我写的东西不清楚,请告诉我。

相关问题