Open GoogleCodeExporter opened 8 years ago
Not in the short term. I'm swamped under a few projects at the moment, so a
faster solution for you might be to
go through a 3rd party like Max or Blender to calculate the normals and
re-export the OBJ.
MattD
Original comment by mattdit...@gmail.com
on 3 Aug 2009 at 3:26
Original comment by mattdit...@gmail.com
on 3 Aug 2009 at 3:29
what about cross product? http://en.wikipedia.org/wiki/Cross_product
// Get OBJ model //
OBJModel modelis = new OBJModel(this, "modelis.obj"); // load world
// Init array list //
println("Setting up model");
ArrayList faceArrayList = new ArrayList(); // create array list to hold all faces
//Load everything into Vector3d arrays
for (int faceNr=0;faceNr<modelis.getTotalFaceCount();faceNr++) { // for all faces in the model
PVector[] vertexesThatShapeAFacePV = modelis.getFaceVertArray(faceNr); // get the PVector array for coords of vertexes that make a face
Vector3d[] vertexesThatShapeAFace = new Vector3d[vertexesThatShapeAFacePV.length]; // load that into Vector3d array
for (int i=0;i<vertexesThatShapeAFace.length;i++) {
vertexesThatShapeAFace[i] = new Vector3d(vertexesThatShapeAFacePV[i].x,vertexesThatShapeAFacePV[i].y,vertexesThatShapeAFacePV[i].z);
}
faceArrayList.add(vertexesThatShapeAFace); // add to array list
}
println("There are "+faceArrayList.size()+" faces in the model");
// create face normals for each face
println("Get plane normals for each face");
ArrayList faceNormalsArrayList = new ArrayList();
for(int i=0; i<faceArrayList.size(); i++) { // for each face in the OBJ model
Vector3d[] currVector = (Vector3d[])faceArrayList.get(i); // get the Vector3d array that holds all vertexes coords
// if there are at least 3 vertexes ( assert(currVector.length >= 3) should always evaluate, if not then obj file is corrupt as min poly is trangle by definition and also
OBJ spec.)
if (currVector.length >= 3) {
// search for vectors that are not parallel
for (int j=2;j<currVector.length;j++) { // for each vertex
Vector3d vect1 = new Vector3d(currVector[j].x-currVector[j-1].x,currVector[j].y-currVector[j-1].y,currVector[j].z-currVector[j-1].z);
Vector3d vect2 = new Vector3d(currVector[j-2].x-currVector[j-1].x,currVector[j-2].y-currVector[j-1].y,currVector[j-2].z-currVector[j-1].z);
if (vect1.angle(vect2) != 0 || vect1.angle(vect2) != PI) { // if these are not parallel vectors!
println ("Vectors chosen for calculating plane normal for poly no. "+i+" are "+vect1+" and "+vect2);
Vector3d planeNormal = new Vector3d(); // surface normal
planeNormal.cross(vect1, vect2);
println ("Plane normal vector for poly no. "+i+" is: "+planeNormal);
planeNormal.normalize(); // !
faceNormalsArrayList.add(planeNormal);
println ("Normalized plane normal vector for poly no. "+i+" is: "+planeNormal);
break;
}
}
}
}
Original comment by m...@krokoarch.lv
on 13 Sep 2009 at 8:31
Original issue reported on code.google.com by
josep.co...@gmail.com
on 2 Aug 2009 at 8:12