计算顶点法线OpenGL

Chr*_*ris 3 c++ opengl normals vertex

我正在尝试计算波的顶点法线,但是我得到的是方格效果,而不是所需的平滑着色.

在此输入图像描述

我不确定我是否将正确的向量传递给calcNormal()函数或者是否有其他错误.

这是我的波码

Vector3 wave1(Sea::seaGrid[i][j].x, Sea::sinVals[k], Sea::seaGrid[i][j].z);
Vector3 wave2(Sea::seaGrid[i][j+1].x, Sea::sinVals[k], Sea::seaGrid[i][j+1].z);
Vector3 wave3(Sea::seaGrid[i+1][j+1].x, Sea::sinVals[nextK], Sea::seaGrid[i+1][j+1].z);
Vector3 wave4(Sea::seaGrid[i+1][j].x, Sea::sinVals[nextK], Sea::seaGrid[i+1][j].z);

Vector3 waveNorm1 = wave1.calcNormal(wave2);
Vector3 waveNorm2 = wave2.calcNormal(wave3);
Vector3 waveNorm3 = wave3.calcNormal(wave4);
Vector3 waveNorm4 = wave4.calcNormal(wave1);

//rest of wave
glBegin(GL_POLYGON);    
glNormal3f(waveNorm1.x, waveNorm1.y, waveNorm1.z);glTexCoord2f(0.0, 1.0);glVertex3f(Sea::seaGrid[i][j].x, Sea::sinVals[k], Sea::seaGrid[i][j].z);
glNormal3f(waveNorm2.x, waveNorm2.y, waveNorm2.z);glTexCoord2f(0.0, 0.0);glVertex3f(Sea::seaGrid[i][j+1].x, Sea::sinVals[k], Sea::seaGrid[i][j+1].z);
glNormal3f(waveNorm3.x, waveNorm3.y, waveNorm3.z);glTexCoord2f(1.0, 0.0);glVertex3f(Sea::seaGrid[i+1][j+1].x, Sea::sinVals[nextK], Sea::seaGrid[i+1][j+1].z);
glNormal3f(waveNorm4.x, waveNorm4.y, waveNorm4.z);glTexCoord2f(1.0, 1.0);glVertex3f(Sea::seaGrid[i+1][j].x, Sea::sinVals[nextK], Sea::seaGrid[i+1][j].z);
glEnd();
Run Code Online (Sandbox Code Playgroud)

这是calcNormal()功能

Vector3& Vector3::calcNormal(const Vector3 &other){

Vector3 normal = crossProduct(*this, other);

//normalises vector
float vecLength = sqrt(pow(normal.x,2)+pow(normal.y,2)+pow(normal.z,2));// length();

normal.x = normal.x / vecLength;
normal.y = normal.y / vecLength;
normal.z = normal.z / vecLength;

return normal;
}
Run Code Online (Sandbox Code Playgroud)

这就是crossProduct()功能

Vector3 Vector3::crossProduct( const Vector3 &v1,  const Vector3 &v2 )
{
Vector3 vCrossProduct;

vCrossProduct.x = v1.y * v2.z - v1.z * v2.y;
vCrossProduct.y = v1.z * v2.x - v1.x * v2.z;
vCrossProduct.z = v1.x * v2.y - v1.y * v2.x;

return vCrossProduct;
}
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

dat*_*olf 5

那些毫无意义:

Vector3 waveNorm1 = wave1.calcNormal(wave2);
Vector3 waveNorm2 = wave2.calcNormal(wave3);
Vector3 waveNorm3 = wave3.calcNormal(wave4);
Vector3 waveNorm4 = wave4.calcNormal(wave1);
Run Code Online (Sandbox Code Playgroud)

通过这个你计算位置向量的叉积.但你真正想要的是当地差异的交叉产物,即差异.

即(wave2 - wave1)×(wave3 - wave1)

  • 不完全,因为这会给你面部法线,但你肯定想要顶点平滑法线.从技术上讲,你要做的是确定顶点位置处的曲面斜率,即线性相关向量跨越局部近似平面构成顶点周围的曲面片,然后取出它们的叉积.在你的情况下还有另一种方式:你正在使用一个罪恶的波.法线是局部偏导数的叉积,你可以写下来(`d/dx a sin(bx)= cos(x)b`) (3认同)