[英]Calculating vertex normals OpenGL
我正在嘗試計算波的頂點法線,但是我得到的是方格效果,而不是所需的平滑着色。
我不確定我是否將正確的向量傳遞給calcNormal()
函數或者是否有其他錯誤。
這是我的wave代碼
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();
這是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;
}
這是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;
}
有任何想法嗎?
那些毫無意義:
Vector3 waveNorm1 = wave1.calcNormal(wave2); Vector3 waveNorm2 = wave2.calcNormal(wave3); Vector3 waveNorm3 = wave3.calcNormal(wave4); Vector3 waveNorm4 = wave4.calcNormal(wave1);
通過這個你計算位置向量的叉積。 但你真正想要的是當地差異的交叉產物,即差異。
即(wave2 - wave1)×(wave3 - wave1)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.