Calculate normal
Posted: November 29th, 2020, 1:15 am
Hi guys, I'm making some terrain using perlin noise and my normals for lighting are not looking right, can someone help me find the error?
and the code for cross:
In the model that I created in blender have the nomals correct, they are generated by blender, but my manual mesh does not look good. The faces behind the hills are darker, but the faces in front are not lighter like in the model.
I'm using psn00bsdk + gcc 10.2
Thanks for the help.
Code: Select all
const auto x1y1 = perlin.noise2d(x1, y1),
x0y0 = perlin.noise2d(x0, y0),
...;
mesh[meshIdx] = {X+1 , x1y1, Z+1, 0};
mesh[meshIdx+1] = {X , x0y0, Z , 0};
mesh[meshIdx+2] = {X , x0y1, Z+1, 0};
//calculate side2 - side1 for cross
const SVECTOR side1 = {mesh[meshIdx+1].vx - mesh[meshIdx].vx, mesh[meshIdx+1].vy - mesh[meshIdx].vy, mesh[meshIdx+1].vz - mesh[meshIdx].vz };
const SVECTOR side2 = {mesh[meshIdx+1].vx - mesh[meshIdx+2].vx, mesh[meshIdx+1].vy - mesh[meshIdx+2].vy, mesh[meshIdx+1].vz - mesh[meshIdx+2].vz };
normals[0] = MathUtils::cross(side1, side2);
mesh[meshIdx+3] = {X , x0y0, Z, 0};
mesh[meshIdx+4] = {X+1, x1y1, Z+1, 0};
mesh[meshIdx+5] = {X+1, x1y0, Z, 0};
//calculate side4 - side3 for cross
const SVECTOR side3 = {mesh[meshIdx+4].vx - mesh[meshIdx+3].vx, mesh[meshIdx+4].vy - mesh[meshIdx+3].vy, mesh[meshIdx+4].vz - mesh[meshIdx+3].vz };
const SVECTOR side4 = {mesh[meshIdx+4].vx - mesh[meshIdx+5].vx, mesh[meshIdx+4].vy - mesh[meshIdx+5].vy, mesh[meshIdx+4].vz - mesh[meshIdx+5].vz };
normals[1] = MathUtils::cross(side3, side4);
and the code for cross:
Code: Select all
static constexpr SVECTOR cross(const SVECTOR& left, const SVECTOR& right)
{
return {((left.vy*right.vz)-(left.vz*right.vy))>>12,
((left.vz*right.vx)-(left.vx*right.vz))>>12,
((left.vx*right.vy)-(left.vy*right.vx))>>12
};
}
I'm using psn00bsdk + gcc 10.2
Thanks for the help.