Do not calculate same normal multiple times so triangulation won't effect curved normal calculation.

This commit is contained in:
Viktor Kovacs 2021-05-24 20:40:34 +02:00
parent 6613cd96cd
commit 251b42ad06
2 changed files with 55 additions and 8 deletions

View File

@ -6,22 +6,36 @@ OV.FinalizeModel = function (model, getDefaultMaterial)
{
function AddAverageNormal (mesh, triangle, vertexIndex, triangleNormals, vertexToTriangles)
{
// TODO: do not calculate the same normal multiple times
let averageNormal = new OV.Coord3D (0.0, 0.0, 0.0);
let averageCount = 0;
function IsNormalInArray (array, normal)
{
for (let i = 0; i < array.length; i++) {
let current = array[i];
if (OV.CoordIsEqual3D (current, normal)) {
return true;
}
}
return false;
}
let averageNormals = [];
let neigTriangles = vertexToTriangles[vertexIndex];
for (let i = 0; i < neigTriangles.length; i++) {
let neigIndex = neigTriangles[i];
let neigTriangle = mesh.GetTriangle (neigIndex);
if (triangle.curve === neigTriangle.curve) {
averageNormal = OV.AddCoord3D (averageNormal, triangleNormals[neigIndex]);
averageCount = averageCount + 1;
let triangleNormal = triangleNormals[neigIndex];
if (!IsNormalInArray (averageNormals, triangleNormal)) {
averageNormals.push (triangleNormal);
}
}
}
let averageNormal = new OV.Coord3D (0.0, 0.0, 0.0);
for (let i = 0; i < averageNormals.length; i++) {
averageNormal = OV.AddCoord3D (averageNormal, averageNormals[i]);
}
averageNormal.MultiplyScalar (1.0 / averageCount);
averageNormal.MultiplyScalar (1.0 / averageNormals.length);
averageNormal.Normalize ();
return mesh.AddNormal (averageNormal);
}

View File

@ -149,6 +149,39 @@ describe ('Model Finalization', function() {
assert.strictEqual (normal.y, -0.7071067811865475);
assert.strictEqual (normal.z, 0.7071067811865475);
});
it ('Calculate Curved Normal 2', function () {
var mesh = new OV.Mesh ();
var v0 = mesh.AddVertex (new OV.Coord3D (0.0, 0.0, 0.0));
var v1 = mesh.AddVertex (new OV.Coord3D (1.0, 0.0, 0.0));
var v2 = mesh.AddVertex (new OV.Coord3D (1.0, 1.0, 0.0));
var v3 = mesh.AddVertex (new OV.Coord3D (0.0, 0.0, -1.0));
var v4 = mesh.AddVertex (new OV.Coord3D (0.0, 1.0, 0.0));
var triangle1 = new OV.Triangle (v0, v1, v2);
triangle1.curve = 1;
var triangle2 = new OV.Triangle (v0, v2, v4);
triangle2.curve = 1;
var triangle3 = new OV.Triangle (v0, v3, v1);
triangle3.curve = 1;
mesh.AddTriangle (triangle1);
mesh.AddTriangle (triangle2);
mesh.AddTriangle (triangle3);
var model = new OV.Model ()
var meshIndex = model.AddMesh (mesh);
OV.FinalizeModel (model, function () { new OV.Material () });
var theMesh = model.GetMesh (meshIndex);
assert.strictEqual (theMesh.NormalCount (), 9);
var normal = theMesh.GetNormal (0);
assert.strictEqual (normal.x, 0.0);
assert.strictEqual (normal.y, -0.7071067811865475);
assert.strictEqual (normal.z, 0.7071067811865475);
});
});
describe ('Color Conversion', function() {