Revision ef231eba
Added by Leszek Koltunski over 4 years ago
| src/main/java/org/distorted/examples/meshfile/FactoryCubit.java | ||
|---|---|---|
| 262 | 262 |
mBuffer[0] = v1y*v2z - v2y*v1z; |
| 263 | 263 |
mBuffer[1] = v1z*v2x - v2z*v1x; |
| 264 | 264 |
mBuffer[2] = v1x*v2y - v2x*v1y; |
| 265 |
|
|
| 266 |
android.util.Log.e("D", " buffer: "+mBuffer[0]+" "+mBuffer[1]+" "+mBuffer[2]);
|
|
| 267 |
|
|
| 268 |
|
|
| 269 |
if( mBuffer[2]<0.0f ) |
|
| 270 |
{
|
|
| 271 |
mBuffer[0] *= -1.0f; |
|
| 272 |
mBuffer[1] *= -1.0f; |
|
| 273 |
mBuffer[2] *= -1.0f; |
|
| 274 |
} |
|
| 265 | 275 |
} |
| 266 | 276 |
|
| 267 | 277 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| ... | ... | |
| 306 | 316 |
} |
| 307 | 317 |
|
| 308 | 318 |
info.scale = Math.max(maxX-minX,maxY-minY); |
| 319 |
|
|
| 309 | 320 |
int len = vert3D.length; |
| 310 | 321 |
info.vertices = new float[2*len]; |
| 311 | 322 |
|
| ... | ... | |
| 367 | 378 |
|
| 368 | 379 |
computeNormalVector(vert3D,0,1,foundIndex); |
| 369 | 380 |
|
| 370 |
// rotate so that the normal vector becomes (0,0,1) |
|
| 371 |
float axisX = -mBuffer[1]; |
|
| 372 |
float axisY = mBuffer[0]; |
|
| 373 |
float axisZ = 0.0f; |
|
| 374 |
|
|
| 375 |
float vecLen = mBuffer[0]*mBuffer[0] + mBuffer[1]*mBuffer[1] + mBuffer[2]*mBuffer[2]; |
|
| 376 |
vecLen = (float)Math.sqrt(vecLen); |
|
| 377 |
mBuffer[0] /= vecLen; |
|
| 378 |
mBuffer[1] /= vecLen; |
|
| 379 |
mBuffer[2] /= vecLen; |
|
| 380 |
|
|
| 381 |
float axiLen = axisX*axisX + axisY*axisY + axisZ*axisZ; |
|
| 382 |
axiLen = (float)Math.sqrt(axiLen); |
|
| 383 |
axisX /= axiLen; |
|
| 384 |
axisY /= axiLen; |
|
| 385 |
axisZ /= axiLen; |
|
| 386 |
|
|
| 387 |
float cosTheta = mBuffer[2]; |
|
| 388 |
float sinTheta = axiLen / vecLen; |
|
| 389 |
|
|
| 390 |
mQuat1[0] = axisX*sinTheta; |
|
| 391 |
mQuat1[1] = axisY*sinTheta; |
|
| 392 |
mQuat1[2] = axisZ*sinTheta; |
|
| 393 |
mQuat1[3] = cosTheta; |
|
| 394 |
mQuat2[0] = axisX*sinTheta; |
|
| 395 |
mQuat2[1] = axisY*sinTheta; |
|
| 396 |
mQuat2[2] = axisZ*sinTheta; |
|
| 397 |
mQuat2[3] = -cosTheta; |
|
| 398 |
|
|
| 399 |
for (float[] vert : vert3D) |
|
| 381 |
if( mBuffer[0]!=0.0f || mBuffer[1]!=0.0f ) |
|
| 400 | 382 |
{
|
| 401 |
quatMultiply(mQuat1, vert, mQuat3); |
|
| 402 |
quatMultiply(mQuat3, mQuat2, vert); |
|
| 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; |
|
| 393 |
|
|
| 394 |
float axiLen = axisX*axisX + axisY*axisY + axisZ*axisZ; |
|
| 395 |
axiLen = (float)Math.sqrt(axiLen); |
|
| 396 |
axisX /= axiLen; |
|
| 397 |
axisY /= axiLen; |
|
| 398 |
axisZ /= axiLen; |
|
| 399 |
|
|
| 400 |
float cosTheta = mBuffer[2]; |
|
| 401 |
//float sinTheta = axiLen / vecLen; |
|
| 402 |
|
|
| 403 |
float sinHalfTheta = (float)Math.sqrt(0.5f*(1-cosTheta)); |
|
| 404 |
float cosHalfTheta = (float)Math.sqrt(0.5f*(1+cosTheta)); |
|
| 405 |
|
|
| 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; |
|
| 414 |
|
|
| 415 |
for (float[] vert : vert3D) |
|
| 416 |
{
|
|
| 417 |
quatMultiply(mQuat1, vert, mQuat3); |
|
| 418 |
quatMultiply(mQuat3, mQuat2, vert); |
|
| 419 |
} |
|
| 403 | 420 |
} |
| 404 | 421 |
|
| 405 | 422 |
// fit the whole thing in a square and remember the scale & 2D vertices |
| ... | ... | |
| 584 | 601 |
} |
| 585 | 602 |
} |
| 586 | 603 |
|
| 604 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
| 605 |
|
|
| 606 |
private void printInfo(FaceInfo info) |
|
| 607 |
{
|
|
| 608 |
android.util.Log.e("D", "vx="+info.vx+" vy="+info.vy+" vz="+info.vz);
|
|
| 609 |
android.util.Log.e("D", "qx="+info.qx+" qy="+info.qy+" qz="+info.qz+" qw="+info.qw);
|
|
| 610 |
android.util.Log.e("D", "scale="+info.scale);
|
|
| 611 |
|
|
| 612 |
String ver=""; |
|
| 613 |
|
|
| 614 |
int len = info.vertices.length/2; |
|
| 615 |
|
|
| 616 |
for(int i =0; i<len; i++) |
|
| 617 |
{
|
|
| 618 |
ver += ("("+info.vertices[2*i]+","+info.vertices[2*i+1]+") ");
|
|
| 619 |
} |
|
| 620 |
|
|
| 621 |
android.util.Log.e("D", "vertices= "+ver);
|
|
| 622 |
} |
|
| 623 |
|
|
| 587 | 624 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| 588 | 625 |
|
| 589 | 626 |
MeshBase createRoundedSolid(final float[][] vertices, final int[][] vertIndexes, final float[][] bands, final int[] bandIndexes) |
Also available in: Unified diff
Face cubit creation: progress, a cube rendered almost correctly :)