DiffuseLight3DCG
照明下での面の色(diffuse)を決める
ライトがある時の面の色は、面の設定色 * (面の法線とライトの向きの内積) で計算します。
まず、面の法線を出します。destに法線が入ります。
Vertex dest = new Vertex();
m3.normal(dest, v1, v2, v3);
ライトの向きとの内積を出します。
float lw = m3.dot(dest,lightDir);
もともとの設定色にlwと255を掛けると、色が決まります。
int r = (int)(color.x * lw * 255);
int g = (int)(color.y * lw * 255);
int b = (int)(color.z * lw * 255);
void drawTriangle(Vertex v1, Vertex v2, Vertex v3, int[] pix, Vertex lightDir, Vertex color)
{
Vertex dest = new Vertex();
m3.normal(dest, v1, v2, v3);
float lw = m3.dot(dest,lightDir);
if (lw < 0) return;
int r = (int)(color.x * lw * 255);
int g = (int)(color.y * lw * 255);
int b = (int)(color.z * lw * 255);
if (r < 0) r = 0; if (255 < r) r = 255;
if (g < 0) g = 0; if (255 < g) g = 255;
if (b < 0) b = 0; if (255 < b) b = 255;
for (int i = 0; i < hei; i++) {
min[i] = 9999999;//minに巨大な数で初期化
max[i] = -9999999;//maxに微小な数
}
int v1x = (int)v1.x + cenWid;
int v2x = (int)v2.x + cenWid;
int v3x = (int)v3.x + cenWid;
int v1y = hei - (int)v1.y - cenHei;
int v2y = hei - (int)v2.y - cenHei;
int v3y = hei - (int)v3.y - cenHei;
int top_y = -9999999;
int low_y = 9999999;
if (low_y > v1y) low_y = v1y;
if (low_y > v2y) low_y = v2y;
if (low_y > v3y) low_y = v3y;
if (top_y < v1y) top_y = v1y;
if (top_y < v2y) top_y = v2y;
if (top_y < v3y) top_y = v3y;
drawLineTate(v1x, v1y, v2x, v2y);
drawLineTate(v2x, v2y, v3x, v3y);
drawLineTate(v3x, v3y, v1x, v1y);
for (int i = low_y; i < top_y; i++) {
for (int j = min[i]; j < max[i]; j++) {
if ( j < 0 | wid <= j) continue;//画面内に収める
pix[i * wid + j] = 255 << 24 | r << 16 | g << 8 | b;
}
}
}
2008年01月07日(月) 19:46:23 Modified by eruvasu