Wiki内検索
最近更新したページ
2011-08-24
2010-05-18
2010-05-03
2010-02-18
2010-02-10
2010-02-09
2010-02-08
2010-02-07
2010-02-02
2009-12-24
2009-12-05
2009-07-05
2009-07-03
最新コメント
MenuBar1 by stunning seo guys
MenuBar1 by stunning seo guys
MenuBar1 by stunning seo guys
MenuBar1 by awesome things!
MenuBar1 by awesome things!
MenuBar1 by awesome things!
MenuBar1 by check it out
MenuBar1 by awesome things!
MenuBar1 by check it out
MenuBar1 by stunning seo guys
Menu
Programming Tips
タグ

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




スマートフォン版で見る