プログラムで剥がれた表面に問題があります。
OpenGL(Tao) を使用していくつかのサーフェスをレンダリングします。私はtriangle_stripを使用しています。3D の印象を良くするために、照明を使用します。法線は正しく設定されています。
最初は crossProduct を使用していましたが、現在は陰関数の派生を使用しています。どちらの方法でも正しい結果が得られるようですが、精度のために導出の方が優れている場合があります。表面に縦縞が見えます。ストリップ内の隣接する 2 つの三角形の色相/色合いが異なります。1,3,5,7 ... と 2,4,6 ... は同じ色相/色合いです。視野角が小さいほど、その差は大きくなります。90°でOKです。
どうすれば縞模様を取り除くことができますか?
ここで画像を見ることができます:
初期化:
private float[] materialAmbient = { 1.0f, 1.0f, 1.0f, 1.0f };
private float[] materialDifuse = { 0.6f, 0.6f, 0.6f, 1.0f };
private float[] materialOdlesky = { 0.2f, 0.2f, 0.2f, 1.0f };
private float[] materialShininess = { 50.0f };
private float[] light_position = { 0.0f, 0.0f, 1.0f, 1.0f};
private float[] light_color = { 0.7f, 0.7f, 0.7f }
Gl.glShadeModel(Gl.GL_SMOOTH);
Gl.glEnable(Gl.GL_DEPTH_TEST);
Gl.glHint(Gl.GL_LINE_SMOOTH_HINT, Gl.GL_NICEST);
Gl.glDepthFunc(Gl.GL_LESS);
Gl.glEnable(Gl.GL_COLOR_MATERIAL);
Gl.glMaterialfv(Gl.GL_FRONT_AND_BACK, Gl.GL_AMBIENT, materialAmbient);
Gl.glMaterialfv(Gl.GL_FRONT_AND_BACK, Gl.GL_DIFFUSE, materialDifuse);
Gl.glMaterialfv(Gl.GL_FRONT_AND_BACK, Gl.GL_SPECULAR, materialOdlesky);
Gl.glMaterialfv(Gl.GL_FRONT_AND_BACK, Gl.GL_SHININESS, materialShininess);
Gl.glLightfv(Gl.GL_LIGHT0, Gl.GL_POSITION, light_position);
Gl.glLightfv(Gl.GL_LIGHT0, Gl.GL_DIFFUSE, light_color);
Gl.glLightModeli(Gl.GL_LIGHT_MODEL_TWO_SIDE, Gl.GL_TRUE);
Gl.glEnable(Gl.GL_LIGHTING);
Gl.glEnable(Gl.GL_LIGHT0);
描画コード:
double foo = 15;
for (double v = -foo; v < foo; v += vStep)
{
if (v > foo - vStep)
v = foo - vStep;
Gl.glBegin(Gl.GL_TRIANGLE_STRIP);
Gl.glColor3dv(_color);
for (double u = -foo; u < foo + uStep; u += uStep)
{
if (u > foo)
u = foo;
SetVextexAndHisNormal(u, v);
SetVextexAndHisNormal(u, v + vStep);
if (u == foo)
break;
}
Gl.glEnd();
if (v == foo - vStep)
break;
}
public void SetVextexAndHisNormal(double u, double v)
{
Vector v1 = ComputeCoordinatesAt(u, v);
double x = (-2 / (_a + _a)) * v1.GetX();
double y = (2 / (_b + _b)) * v1.GetY();
double z = -2*_k;
Vector normal = new Vector(x, y, z);
normal.NornVector();
Gl.glNormal3d(_normalSign * normal.GetX(), _normalSign * normal.GetY(), _normalSign * normal.GetZ());
Gl.glVertex3d(v1.GetX(), v1.GetY(), v1.GetZ());
}