Нормали некоторых объектов высчитываются вывернутыми, а другие - нет
Пишу свой 3D-движок и столкнулся с проблемой, почему нормали моделей могут быть вывернуты... Проверял в Blender-е, а там пишет, что все нормально. Думаю, что проблема в том, как они высчитываются.
Цвета фигуры - нормали, так же добавил линии в сторону направления нормали.
std::vector<ne::Math3D::Vector3> Vertices;
ne::Math3D::Vector3 NVertices[3];
for (int j = 0; j < 3; j++)
{
const ne::Math4D::Vector4 FirstCurrentVertex = Target.getStatic() ? CurrentFace.vertices[j] : getFirstResultVertex(CurrentFace.vertices[j], Target);
NVertices[j] = FirstCurrentVertex;
Vertices.push_back(MainCamera.getCameraMatrix() * FirstCurrentVertex);
}
Vertices = clip(Vertices, ne::Plane(ne::Math3D::Vector3(0.f, 0.f, -1.f), MainCamera.zNear));
if (Vertices.size() > 2)
{
ne::Object::Mesh::FaceInf Result;
for (int i = 0; i < Vertices.size(); i++)
{
ne::Math3D::Vector3 CurrentVertex = getSecondResultVertex(Vertices[i], MainCamera, MainWindow);
Result.centerZ += Vertices[i].z;
Result.centerX += Vertices[i].x;
Result.centerY += Vertices[i].y;
Result.vertices.push_back(CurrentVertex);
}
Result.centerZ /= Vertices.size();
Result.centerX /= Vertices.size();
Result.centerY /= Vertices.size();
Result.faceMaterial = &Target.material;
ne::Math3D::Vector3 normal = (NVertices[0] - NVertices[1]).cross(NVertices[0] - NVertices[2]).normalize();
Result.faceNormal = normal;
float normalDotCamera = normal.dot((MainCamera.getResultTransform().forward() ).normalize());
if (normalDotCamera < 0.f && Target.getInvertedNormals() || normalDotCamera > 0.f && !Target.getInvertedNormals())
{
ObjectsVector.push_back(Result);
}
}
Ответы (1 шт):
Автор решения: TrASH
→ Ссылка
Оказалось, что неправильным был не алгоритм, а модель пешки... Даже Unity отображал ее так же, как и мой движок.