This commit is contained in:
Thomas Forgione 2019-12-11 23:22:50 +01:00
parent d3a505bfcc
commit 46363f19c9
No known key found for this signature in database
GPG Key ID: BFD17A2D71B3B5E7
4 changed files with 103 additions and 1 deletions

View File

@ -51,7 +51,8 @@ f 1 2 3
**Attention :** en OBJ, les indices commencent à partir de 1 **Attention :** en OBJ, les indices commencent à partir de 1
**Attention :** dans notre logiciel, seules les faces triangulaires sont implémentées. **Attention :** dans notre logiciel, seules les faces triangulaires sont
implémentées.
###### Edition d'un sommet ###### Edition d'un sommet
@ -64,6 +65,16 @@ v 0.0 0.0 0.0
ev 1 1.0 1.0 1.0 ev 1 1.0 1.0 1.0
``` ```
###### Translation d'un sommet
De la même façon, un sommet peut être translaté grâce aux caractères `tv`. Par
exemple :
```
v 1.0 2.0 3.0
tv 1 1.0 1.0 1.0
```
###### Edition d'une face ###### Edition d'une face
Notre format OBJ permet la modification d'une ancienne face. Pour modifier une Notre format OBJ permet la modification d'une ancienne face. Pour modifier une
@ -79,6 +90,19 @@ f 1 2 3
ef 1 1 2 4 ef 1 1 2 4
``` ```
On peut aussi changer un seul sommet d'une face grâce aux caractères `efv`,
suivi de l'indice de la face à modifier, de l'indice du sommet à modifier (1, 2
ou 3) et de la nouvelle valeur du sommet. Par exemple :
```
v 0.0 0.0 0.0
v 1.0 0.0 0.0
v 1.0 1.0 0.0
v 1.0 1.0 1.0
f 1 2 3
efv 1 3 4
```
###### Suppression d'une face ###### Suppression d'une face
Notre format OBJ permet la suppression d'une ancienne face. Pour supprimer une Notre format OBJ permet la suppression d'une ancienne face. Pour supprimer une
face, il suffit d'utiliser les caracètres `df` suivis de l'indice de la face à face, il suffit d'utiliser les caracètres `df` suivis de l'indice de la face à

View File

@ -88,6 +88,23 @@ function parseLine(line) {
); );
return element; return element;
case "tv":
element.type = Element.TranslateVertex;
element.id = parseInt(split[1], 10) - 1;
element.value = new THREE.Vector3(
parseFloat(split[2]),
parseFloat(split[3]),
parseFloat(split[4]),
);
return element;
case "efv":
element.type = Element.EditFaceVertex;
element.id = parseInt(split[1], 10) - 1;
element.oldIndex = parseInt(split[2], 10) - 1;
element.value = parseInt(split[3], 10) - 1;
return element;
case "ef": case "ef":
element.type = Element.EditFace; element.type = Element.EditFace;
element.id = parseInt(split[1], 10) - 1; element.id = parseInt(split[1], 10) - 1;
@ -120,6 +137,8 @@ Element.AddTriangleStrip = "AddTriangleStrip";
Element.AddTriangleFan = "AddTriangleFan"; Element.AddTriangleFan = "AddTriangleFan";
Element.EditVertex = "EditVertex"; Element.EditVertex = "EditVertex";
Element.EditFace = "EditFace"; Element.EditFace = "EditFace";
Element.EditFaceVertex = "EditFaceVertex";
Element.TranslateVertex = "TranslateVertex";
Element.DeleteFace = "DeleteFace"; Element.DeleteFace = "DeleteFace";
class Loader { class Loader {
@ -244,6 +263,12 @@ class Model extends THREE.Mesh {
this.geometry.verticesNeedUpdate = true; this.geometry.verticesNeedUpdate = true;
break; break;
case Element.TranslateVertex:
this.checkVertex(element.id);
this.geometry.vertices[element.id].add(element.value);
this.geometry.verticesNeedUpdate = true;
break;
case Element.AddFace: case Element.AddFace:
f = element.value; f = element.value;
@ -297,6 +322,20 @@ class Model extends THREE.Mesh {
this.geometry.elementsNeedUpdate = true; this.geometry.elementsNeedUpdate = true;
break; break;
case Element.EditFaceVertex:
this.checkFaceId(element.id);
switch (element.oldIndex) {
case 0: this.geometry.faces[element.id].a = element.value; break;
case 1: this.geometry.faces[element.id].b = element.value; break;
case 2: this.geometry.faces[element.id].c = element.value; break;
default: this.throwError("Old vertex id in EditFaceVertex must be 1, 2 or 3, but was " + element.oldIndex + 1);
}
this.geometry.elementsNeedUpdate = true;
break;
case Element.DeleteFace: case Element.DeleteFace:
this.geometry.faces[element.id].materialIndex = 1; this.geometry.faces[element.id].materialIndex = 1;
this.geometry.elementsNeedUpdate = true; this.geometry.elementsNeedUpdate = true;

View File

@ -88,6 +88,23 @@ function parseLine(line) {
); );
return element; return element;
case "tv":
element.type = Element.TranslateVertex;
element.id = parseInt(split[1], 10) - 1;
element.value = new THREE.Vector3(
parseFloat(split[2]),
parseFloat(split[3]),
parseFloat(split[4]),
);
return element;
case "efv":
element.type = Element.EditFaceVertex;
element.id = parseInt(split[1], 10) - 1;
element.oldIndex = parseInt(split[2], 10) - 1;
element.value = parseInt(split[3], 10) - 1;
return element;
case "ef": case "ef":
element.type = Element.EditFace; element.type = Element.EditFace;
element.id = parseInt(split[1], 10) - 1; element.id = parseInt(split[1], 10) - 1;
@ -120,6 +137,8 @@ Element.AddTriangleStrip = "AddTriangleStrip";
Element.AddTriangleFan = "AddTriangleFan"; Element.AddTriangleFan = "AddTriangleFan";
Element.EditVertex = "EditVertex"; Element.EditVertex = "EditVertex";
Element.EditFace = "EditFace"; Element.EditFace = "EditFace";
Element.EditFaceVertex = "EditFaceVertex";
Element.TranslateVertex = "TranslateVertex";
Element.DeleteFace = "DeleteFace"; Element.DeleteFace = "DeleteFace";
class Loader { class Loader {

View File

@ -64,6 +64,12 @@ class Model extends THREE.Mesh {
this.geometry.verticesNeedUpdate = true; this.geometry.verticesNeedUpdate = true;
break; break;
case Element.TranslateVertex:
this.checkVertex(element.id);
this.geometry.vertices[element.id].add(element.value);
this.geometry.verticesNeedUpdate = true;
break;
case Element.AddFace: case Element.AddFace:
f = element.value; f = element.value;
@ -117,6 +123,20 @@ class Model extends THREE.Mesh {
this.geometry.elementsNeedUpdate = true; this.geometry.elementsNeedUpdate = true;
break; break;
case Element.EditFaceVertex:
this.checkFaceId(element.id);
switch (element.oldIndex) {
case 0: this.geometry.faces[element.id].a = element.value; break;
case 1: this.geometry.faces[element.id].b = element.value; break;
case 2: this.geometry.faces[element.id].c = element.value; break;
default: this.throwError("Old vertex id in EditFaceVertex must be 1, 2 or 3, but was " + element.oldIndex + 1);
}
this.geometry.elementsNeedUpdate = true;
break;
case Element.DeleteFace: case Element.DeleteFace:
this.geometry.faces[element.id].materialIndex = 1; this.geometry.faces[element.id].materialIndex = 1;
this.geometry.elementsNeedUpdate = true; this.geometry.elementsNeedUpdate = true;