首页 > 解决方案 > 计算水面的切线

问题描述

所以我有一个项目,我通过使用正弦波在 x 和 z 中调制网格来模拟 opengl 中的水面。我正在绘制法线、切线和副法线。在 x 或 z 中调制波时,所有切线都正确绘制,但是,同时在 x 和 z 中调制会破坏切线!!!帮助。这是我计算偏导数和矢量图的代码。

float dydx = calcDerivativeX(water->waves, x, g.gameTime);
float dydz = calcDerivativeZ(water->waves, z, g.gameTime);
glColor3f(1,0.5,0);
glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, orange);
    drawVector(x, calcAddSines(water->waves, x, z, g.gameTime), z, 1.0, dydx, 0.0, 0.05);
glColor3f(1,0,1);
glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, magenta);
drawVector(x, calcAddSines(water->waves, x, z, g.gameTime), z, -dydx, 1.0, -dydz, 0.05);
glColor3f(1,1,0);
glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, yellow);
drawVector(x, calcAddSines(water->waves, x, z, g.gameTime), z, 0, dydz, 1.0, 0.05);
float calcDerivativeX(vector<Wave> waves, float x, float t) {
    float result = 0;

    for(Wave w : waves) {
        result += w.a * w.kx * cosf((w.kx * x) + (w.w*t));
    }
    return result;
}


float calcDerivativeZ(vector<Wave> waves, float z, float t) {
    float result = 0;

    for(Wave w : waves) {
        result += w.a * w.kz * cosf((w.kz * z) + (w.w*t));
    }
    return result;
}

float calcAddSines(vector<Wave> waves, float x, float z, float t) {
    float y = 0;

    for(Wave w: waves) {
        y += calcY(w, x, z, t);
    }

    return y;
}

仅 X 调制

仅 Z 调制

X & Z 调制

标签: c++openglnormals

解决方案


推荐阅读