現在、these lessonsに基づく学習経験としてOpenGLをエミュレートするソフトウェアレンダラーを実装しています。プロジェクトのコードはfound here.3Dグラフィックスメッシュの法線ベクトルの回転が倍増
頂点の法線を扱うのがかなり困難です。私は、行列が直交していないときにモデル行列の逆転置を使うべきであることを知っているモデル行列でそれらを変換したいと思います。光の方向は、世界の空間で指定する必要がありますので、法線を変換し、次に光の強度を計算するために使用された世界の空間光の方向のドット積を変換する必要があります。
これは問題です。ここでうまくいきます。モデルを見て上の軸でカメラを45度回転させています。
Iが任意の軸で90度モデルを回転させる場合は、今のところ、最大の軸をとり、光の方向は、他の方法を指すように反転。あなたがここで見ることができるように、光は背中から来ています。
私は180度に回転している場合、それは再び罰金です。ここに示されているように、私は90度、45度光点に回転する場合
。光がどこから来ているかを見るためにスパイクに注目してください。
これは時間のために私が困惑しています。何が間違っているのか分かりません。それはあたかも回転で回転が倍増しているかのようです。光のベクトルはいえ変更されていない、ここを見て:
vec4 SmoothShader::Vertex(int iFace, int nthVert)
{
vec3 vposition = model->vert(iFace, nthVert);
vec4 projectionSpace = MVP * embed<4>(vposition);
vec3 light = vec3(0, 0, 1);
mat4 normTrans = M.invert_transpose();
vec4 normal = normTrans * embed<4>(model->normal(iFace, nthVert), 0.f);
vec3 norm = proj<3>(normal);
intensity[nthVert] = std::max(0.0f, norm.normalise() * light.normalise());
return projectionSpace;
}
bool SmoothShader::Fragment(vec3 barycentric, vec3 &Colour)
{
float pixelIntensity = intensity * barycentric;
Colour = vec3(255, 122, 122) * pixelIntensity;
return true;
}
MVP(モデル、ビュー、投影)とM(モデル)の行列は次のように計算されます。
// Model Matrix, converts to world space
mat4 scale = MakeScale(o->scale);
mat4 translate = MakeTranslate(o->position);
mat4 rotate = MakeRotate(o->rotation);
// Move objects backward from the camera's position
mat4 cameraTranslate = MakeTranslate(vec3(-cameraPosition.x, -cameraPosition.y, -cameraPosition.z));
// Get the camera's rotated basis vectors to rotate everything to camera space.
vec3 Forward;
vec3 Right;
vec3 Up;
GetAxesFromRotation(cameraRotation, Forward, Right, Up);
mat4 cameraRotate = MakeLookAt(Forward, Up);
// Convert from camera space to perspective projection space
mat4 projection = MakePerspective(surf->w, surf->h, 1, 10, cameraFOV);
// Convert from projection space (-1, 1) to viewport space
mat4 viewport = MakeViewport(surf->w, surf->h);
mat4 M = translate * rotate * scale;
mat4 MVP = viewport * projection * cameraRotate * cameraTranslate * M;
任意のアイデア何私は間違っている?
は、変更はありません。モデル行列はこの場合直交しているため、逆転置は実際には同じことです。しかし、多くのオンライン情報源では、非一様なスケーリング(直交ではない)を行う場合、法線を変換するときに逆転置が必要であると言われています。 – Constan7ine
@ Constan7ine申し訳ありません。私は間違ってあなたが逆数を乗じていると思った。逆転置は理にかなっています。もう一度見てみましょう。 –
@ Constan7ine私は他の問題を見ることができません。私はあなたの問題がコードベースのどこかにあると思う。 –