Nanashi-softプログラマ専用DirectX11開発


◇DirectX11プログラミング -法線ベクトルを計算で求める-

LWO2フォーマットを解析していて,法線ベクトルが格納されていない事に気が付いた
どうすればいいのだろう? と思って『法線ベクトルがない』がググってみると,計算で求まるらしい

DirectX11で法線ベクトルを計算する方法メモ
	struct Vertex3D {
float pos[3]; //x-y-z
};

Vertex3D hVectorData[3] = {
{ +0.0f, +0.5f, +0.5f },
{ +0.5f, -0.5f, +0.5f },
{ -0.5f, -0.5f, +0.5f }
};

XMVECTOR p1=XMVectorSet(hVectorData[0][0], hVectorData[0][1], hVectorData[0][2], 1.0f);
XMVECTOR p2=XMVectorSet(hVectorData[1][0], hVectorData[1][1], hVectorData[1][2], 1.0f);
XMVECTOR p3=XMVectorSet(hVectorData[2][0], hVectorData[2][1], hVectorData[2][2], 1.0f);

XMVECTOR v1 = p2 - p1;
XMVECTOR v2 = p3 - p1;

XMVECTOR normal = XMVector3Cross(v1, v2);

float nor_x = XMVectorGetX(normal);
float nor_y = XMVectorGetY(normal);
float nor_z = XMVectorGetZ(normal);
このnor_x,nor_y,nor_zが,3つの頂点の共通した法線ベクトルになる

同じ頂点に2つの法線ベクトルがある場合は,足せばよい
たとえば,法線ベクトルnor_x1と,nor_x2が同じ頂点上にある場合
	nor_x3 = XMVectorAdd(nor_x1, nor_x2);
このnor_x3を設定すればいい


TOPプログラマ専用DirectX11開発