Revision 140f2c4e
Added by Leszek Koltunski about 3 years ago
src/main/java/org/distorted/examples/meshfile/FactoryCubit.java | ||
---|---|---|
263 | 263 |
mBuffer[1] = v1z*v2x - v2z*v1x; |
264 | 264 |
mBuffer[2] = v1x*v2y - v2x*v1y; |
265 | 265 |
|
266 |
android.util.Log.e("D", " buffer: "+mBuffer[0]+" "+mBuffer[1]+" "+mBuffer[2]); |
|
266 |
float len = mBuffer[0]*mBuffer[0] + mBuffer[1]*mBuffer[1] + mBuffer[2]*mBuffer[2]; |
|
267 |
len = (float)Math.sqrt(len); |
|
268 |
mBuffer[0] /= len; |
|
269 |
mBuffer[1] /= len; |
|
270 |
mBuffer[2] /= len; |
|
267 | 271 |
|
268 |
|
|
269 |
if( mBuffer[2]<0.0f ) |
|
270 |
{ |
|
271 |
mBuffer[0] *= -1.0f; |
|
272 |
mBuffer[1] *= -1.0f; |
|
273 |
mBuffer[2] *= -1.0f; |
|
274 |
} |
|
272 |
//android.util.Log.e("D", " normal: "+mBuffer[0]+" "+mBuffer[1]+" "+mBuffer[2]); |
|
275 | 273 |
} |
276 | 274 |
|
277 | 275 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
... | ... | |
378 | 376 |
|
379 | 377 |
computeNormalVector(vert3D,0,1,foundIndex); |
380 | 378 |
|
379 |
// rotate so that the normal vector becomes (0,0,1) |
|
380 |
float axisX, axisY, axisZ; |
|
381 |
|
|
381 | 382 |
if( mBuffer[0]!=0.0f || mBuffer[1]!=0.0f ) |
382 | 383 |
{ |
383 |
// rotate so that the normal vector becomes (0,0,1) |
|
384 |
float axisX = -mBuffer[1]; |
|
385 |
float axisY = mBuffer[0]; |
|
386 |
float axisZ = 0.0f; |
|
387 |
|
|
388 |
float vecLen = mBuffer[0]*mBuffer[0] + mBuffer[1]*mBuffer[1] + mBuffer[2]*mBuffer[2]; |
|
389 |
vecLen = (float)Math.sqrt(vecLen); |
|
390 |
mBuffer[0] /= vecLen; |
|
391 |
mBuffer[1] /= vecLen; |
|
392 |
mBuffer[2] /= vecLen; |
|
384 |
axisX = -mBuffer[1]; |
|
385 |
axisY = mBuffer[0]; |
|
386 |
axisZ = 0.0f; |
|
393 | 387 |
|
394 | 388 |
float axiLen = axisX*axisX + axisY*axisY + axisZ*axisZ; |
395 | 389 |
axiLen = (float)Math.sqrt(axiLen); |
396 | 390 |
axisX /= axiLen; |
397 | 391 |
axisY /= axiLen; |
398 | 392 |
axisZ /= axiLen; |
393 |
} |
|
394 |
else |
|
395 |
{ |
|
396 |
axisX = 0.0f; |
|
397 |
axisY = 1.0f; |
|
398 |
axisZ = 0.0f; |
|
399 |
} |
|
399 | 400 |
|
400 |
float cosTheta = mBuffer[2];
|
|
401 |
//float sinTheta = axiLen / vecLen;
|
|
401 |
float cosTheta = mBuffer[2]; |
|
402 |
//float sinTheta = axiLen / vecLen; |
|
402 | 403 |
|
403 |
float sinHalfTheta = (float)Math.sqrt(0.5f*(1-cosTheta));
|
|
404 |
float cosHalfTheta = (float)Math.sqrt(0.5f*(1+cosTheta));
|
|
404 |
float sinHalfTheta = (float)Math.sqrt(0.5f*(1-cosTheta)); |
|
405 |
float cosHalfTheta = (float)Math.sqrt(0.5f*(1+cosTheta)); |
|
405 | 406 |
|
406 |
mQuat1[0] = axisX*sinHalfTheta;
|
|
407 |
mQuat1[1] = axisY*sinHalfTheta;
|
|
408 |
mQuat1[2] = axisZ*sinHalfTheta;
|
|
409 |
mQuat1[3] = cosHalfTheta;
|
|
410 |
mQuat2[0] = axisX*sinHalfTheta;
|
|
411 |
mQuat2[1] = axisY*sinHalfTheta;
|
|
412 |
mQuat2[2] = axisZ*sinHalfTheta;
|
|
413 |
mQuat2[3] = -cosHalfTheta;
|
|
407 |
mQuat1[0] = axisX*sinHalfTheta; |
|
408 |
mQuat1[1] = axisY*sinHalfTheta; |
|
409 |
mQuat1[2] = axisZ*sinHalfTheta; |
|
410 |
mQuat1[3] = cosHalfTheta; |
|
411 |
mQuat2[0] = axisX*sinHalfTheta; |
|
412 |
mQuat2[1] = axisY*sinHalfTheta; |
|
413 |
mQuat2[2] = axisZ*sinHalfTheta; |
|
414 |
mQuat2[3] = -cosHalfTheta; |
|
414 | 415 |
|
415 |
for (float[] vert : vert3D) |
|
416 |
{ |
|
417 |
quatMultiply(mQuat1, vert, mQuat3); |
|
418 |
quatMultiply(mQuat3, mQuat2, vert); |
|
419 |
} |
|
416 |
for (float[] vert : vert3D) |
|
417 |
{ |
|
418 |
quatMultiply(mQuat1, vert, mQuat3); |
|
419 |
quatMultiply(mQuat3, mQuat2, vert); |
|
420 | 420 |
} |
421 | 421 |
|
422 | 422 |
// fit the whole thing in a square and remember the scale & 2D vertices |
... | ... | |
594 | 594 |
for(int previous=0; previous<face; previous++) |
595 | 595 |
{ |
596 | 596 |
info = mFaceInfo.get(previous); |
597 |
if( tryFindingRotation(info,newInfo.vertices) ) break; |
|
597 |
if( tryFindingRotation(newInfo,info.vertices) ) |
|
598 |
{ |
|
599 |
android.util.Log.e("D", "comparing face "+face+" to "+previous+" SUCCESS!!"); |
|
600 |
break; |
|
601 |
} |
|
598 | 602 |
} |
599 | 603 |
|
600 | 604 |
mFaceInfo.add(newInfo); |
... | ... | |
637 | 641 |
for(int face=0; face<numFaces; face++) |
638 | 642 |
{ |
639 | 643 |
info = mFaceInfo.get(face); |
644 |
|
|
645 |
android.util.Log.d("D", "--------------"); |
|
646 |
printInfo(info); |
|
647 |
|
|
640 | 648 |
band = bands[bandIndexes[face]]; |
641 | 649 |
bandsComputed = computeBands( band[0], (int)band[1], band[2], band[3], (int)band[4]); |
642 | 650 |
meshes[face] = new MeshPolygon(info.vertices,bandsComputed,(int)band[5],(int)band[6]); |
Also available in: Unified diff
Face cubit creation: progress, a cube renders correctly :)