Hi Qulacomm community!
I worked a little bit on my AR-App for my Bachelor Thesis.
I tried several things, with mixed results.
First I calculated a natural cubic spline for some nice looking movements. Theoretical a nice idea, practical a absolute distaster :).
Then I wanted to improve my Tap-Event with a ray picking solution.
I Managed to get a BoundingBox from an Object at runtime:
void calculateBoundingBox() { int i = 0; float MaxX = uSchiffOneTextureVerts[i] , MinX = uSchiffOneTextureVerts[i] , MaxY = uSchiffOneTextureVerts[i+1] , MinY = uSchiffOneTextureVerts[i+1] , MaxZ = uSchiffOneTextureVerts[i+2] , MinZ = uSchiffOneTextureVerts[i+2]; for (i = 0; i < (uSchiffOneTextureNumVerts); i+=3) { //Min/Max Berechnung für die X Werte innerhalb des Float Arrays if (uSchiffOneTextureVerts[i] <= MinX) { MinX = uSchiffOneTextureVerts[i]; } else if (uSchiffOneTextureVerts[i] > MaxX) { MaxX = uSchiffOneTextureVerts[i]; } //Min/Max Berechnung für die Y Werte innerhalb des Float Arrays if (uSchiffOneTextureVerts[i+1] <= MinY) { MinY = uSchiffOneTextureVerts[i+1]; } else if (uSchiffOneTextureVerts[i+1] > MaxY) { MaxY = uSchiffOneTextureVerts[i+1]; } //Min/Max Berechnung für die Z Werte innerhalb des Float Arrays if (uSchiffOneTextureVerts[i+2] <= MinZ) { MinZ = uSchiffOneTextureVerts[i+2]; } else if (uSchiffOneTextureVerts[i+2] > MaxZ) { MaxZ = uSchiffOneTextureVerts[i+2]; } } LOG("MinX: %f, MaxX: %f, MinY: %f, MaxY: %f, MinZ: %f, MaxZ: %f",MinX, MaxX, MinY, MaxY, MinZ, MaxZ); float BB[] = { //front MaxX, MaxY, MaxZ, //P7 MaxX, MinY, MaxZ, //P3 MinX, MaxY, MaxZ, //P1 MinX, MinY, MaxZ, //P5 MinX, MaxY, MaxZ, //P1 MaxX, MinY, MaxZ, //P3 //back MaxX, MaxY, MinZ, //P8 MaxX, MinY, MinZ, //P4 MinX, MaxY, MinZ, //P2 MinX, MinY, MinZ, //P6 MinX, MaxY, MinZ, //P2 MaxX, MinY, MinZ, //P4 //top MaxX, MaxY, MaxZ, //P7 MinX, MaxY, MaxZ, //P1 MinX, MaxY, MinZ, //P2 MaxX, MaxY, MinZ, //P8 MaxX, MaxY, MaxZ, //P7 MinX, MaxY, MinZ, //P2 //bottom MaxX, MinY, MaxZ, //P3 MinX, MinY, MaxZ, //P5 MinX, MinY, MinZ, //P6 MaxX, MinY, MinZ, //P4 MaxX, MinY, MaxZ, //P3 MinX, MinY, MinZ, //P6 //right MaxX, MaxY, MaxZ, //P7 MaxX, MinY, MaxZ, //P3 MaxX, MinY, MinZ, //P4 MaxX, MaxY, MinZ, //P8 MaxX, MinY, MinZ, //P4 MaxX, MaxY, MaxZ, //P7 //left MaxX, MaxY, MaxZ, //P1 MaxX, MinY, MaxZ, //P5 MaxX, MinY, MinZ, //P6 MaxX, MaxY, MinZ, //P2 MaxX, MinY, MinZ, //P6 MaxX, MaxY, MaxZ //P1 }; int size = sizeof(BB) / sizeof(float); LOG("Size: %i",size); for(int count=0; count < size ; count++) { LOG("Size: %i",count); BBUebergabe[count] = BB[count]; }; }
Any Improvements are welcome!
With the gathered vertices i tried to draw colored triangles:
My actual purpose is to implement a ray-box-intersection. In fact that the 2D solution makes a lot of problems, if the 3D-Object is watched from the side.
I copied two methods from the domino example
- projectScreenPointToPlane
- linePlaneIntersection
I solved the actual Tap-Event a little bit different than in the domino example, anywhere.
I implemented a lot of Log messages for some tests .
04-14 12:23:16.070: I/IMAGE_TARGETS(944): MinX: -0.072848, MaxX: 0.069527, MinY: -0.175295, MaxY: 0.082582, MinZ: -0.258850, MaxZ: 0.222944
04-14 12:23:16.070: I/IMAGE_TARGETS(944): Size: 10804-14 12:23:17.200: I/IMAGE_TARGETS(944): Configure Video Background : Video (640,480), Screen (480,800), mSize (600,800)
04-14 12:23:17.430: I/IMAGE_TARGETS(944): getFocalLength(): 617.117981, 618.848022
04-14 12:23:17.430: I/IMAGE_TARGETS(944): getPrincipalPoint(): 320.000000, 240.000000
04-14 12:23:17.430: I/IMAGE_TARGETS(944): getDistortionParameters(): 0.154197, -0.377212, -0.001747, -0.00048904-14 12:23:19.960: I/IMAGE_TARGETS(944): tapx: 169.857819, tapy: 366.257507
04-14 12:23:19.960: I/IMAGE_TARGETS(944): halfScreenWidth: 240.000000
04-14 12:23:19.960: I/IMAGE_TARGETS(944): halfScreenHeight: 400.00000004-14 12:23:19.960: I/IMAGE_TARGETS(944): halfViewportWidth: 300.000000
04-14 12:23:19.960: I/IMAGE_TARGETS(944): halfViewportHeight: 400.00000004-14 12:23:19.960: I/IMAGE_TARGETS(944): x: -0.233807
04-14 12:23:19.960: I/IMAGE_TARGETS(944): y: 0.08435604-14 12:23:19.960: I/IMAGE_TARGETS(944): lineStart.data[0]: -0.361336, lineStart.data[1]: 0.717794, lineStart.data[2]: 0.337030
04-14 12:23:19.960: I/IMAGE_TARGETS(944): lineEnd.data[0]: 3.171073, lineEnd.data[1]: -7.679066, lineEnd.data[2]: -3.885688
04-14 12:23:19.960: I/IMAGE_TARGETS(944): intersection.data[0]: -0.079402, intersection.data[1]: 0.047611, intersection.data[2]: 0.000000
//2D Solution.
04-14 12:23:19.960: I/ImageTargets(944): ToucEvent X: 169.85782| Detect X: 229.65517
04-14 12:23:19.960: I/ImageTargets(944): ToucEvent Y: 366.2575| Detect Y: 450.0
Looks something wrong for you guys?
How can I imagine the lineEnd, lineSTart and intersection vector? Why is everything normalized to -1 and 1?
How can i do a ray cast with these values, anyone an idea?
To my actual thread title.
I want to display my BoundingBox without any filling.
I tried the following shading:
static const char* PointVertexShader = " \
\
attribute vec4 PointvertexPosition; \
uniform mat4 modelViewProjectionMatrix; \
\
void main() \
{ \
gl_Position = modelViewProjectionMatrix * PointvertexPosition; \
} \
";static const char* PointFragmentShader = " \
\
precision mediump float; \
void main() \
{ \
gl_FragColor = vec4(0.0, 1.0, 0.0, 1.0); \
} \
";
And
/*for(int i = 0; i glDrawArrays(GL_TRIANGLE_STRIP, i*3, 4);*/
But nothing is drawn at runtime.
I Know it is saturday and I have a lot of questions, hopefully I get all of them answered :p.
- Robert
++UPDATE++
I think my ray cast is working.
For more information look at this site "http://www.wiziq.com/tutorial/162714-6-837-4-Ray-Casting-2-More-Intersection"
Everything what you need is:
I'm still looking for some help to draw my cube without any filling!
- Robert