Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- public class OpenGLRenderer extends Activity implements GLSurfaceView.Renderer {
- public PointCloud ptCloud;
- MatrixGrabber mg = new MatrixGrabber();
- ...
- public void onDrawFrame(GL10 gl) {
- gl.glDisable(GL10.GL_COLOR_MATERIAL);
- gl.glDisable(GL10.GL_BLEND);
- gl.glDisable(GL10.GL_LIGHTING);
- //Background drawing
- if(customBackground)
- gl.glClearColor(backgroundRed, backgroundGreen, backgroundBlue, 1.0f);
- else
- gl.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
- if (PointCloud.doneParsing == true) {
- if (envDone == false)
- setupEnvironment();
- // Clears the screen and depth buffer.
- gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
- gl.glMatrixMode(GL10.GL_PROJECTION);
- gl.glLoadIdentity();
- GLU.gluPerspective(gl, 55.0f, (float) screenWidth / (float) screenHeight, 10.0f ,10000.0f);
- gl.glMatrixMode(GL10.GL_MODELVIEW);
- gl.glLoadIdentity();
- GLU.gluLookAt(gl, eyeX, eyeY, eyeZ,
- centerX, centerY, centerZ,
- upX, upY, upZ);
- if(pickPointTrigger)
- pickPoint(gl);
- gl.glPushMatrix();
- gl.glTranslatef(_xTranslate, _yTranslate, _zTranslate);
- gl.glTranslatef(centerX, centerY, centerZ);
- gl.glRotatef(_xAngle, 1f, 0f, 0f);
- gl.glRotatef(_yAngle, 0f, 1f, 0f);
- gl.glRotatef(_zAngle, 0f, 0f, 1f);
- gl.glTranslatef(-centerX, -centerY, -centerZ);
- ptCloud.draw(gl);
- gl.glPopMatrix();
- }
- }
- }
- public void pickPoint(GL10 gl){
- mg.getCurrentState(gl);
- double mvmatrix[] = new double[16];
- double projmatrix[] = new double[16];
- int viewport[] = {0,0,screenWidth, screenHeight};
- for(int i=0 ; i<16; i++){
- mvmatrix[i] = mg.mModelView[i];
- projmatrix[i] = mg.mProjection[i];
- }
- mg.getCurrentState(gl);
- float realY = ((float) (screenHeight) - pickY);
- float nearCoords[] = { 0.0f, 0.0f, 0.0f, 0.0f };
- float farCoords[] = { 0.0f, 0.0f, 0.0f, 0.0f };
- GLU.gluUnProject(screenWidth/2, screenHeight/2, 0.0f, mg.mModelView, 0, mg.mProjection, 0,
- viewport, 0, nearCoords, 0);
- GLU.gluUnProject(screenWidth/2, screenHeight/2, 1.0f, mg.mModelView, 0, mg.mProjection, 0,
- viewport, 0, farCoords, 0);
- System.out.println("Near: " + nearCoords[0] + "," + nearCoords[1] + "," + nearCoords[2]);
- System.out.println("Far: " + farCoords[0] + "," + farCoords[1] + "," + farCoords[2]);
- //Plot the points in the scene
- nearMarker.set(nearCoords);
- farMarker.set(farCoords);
- markerOn = true;
- double diffX = nearCoords[0] - farCoords[0];
- double diffY = nearCoords[1] - farCoords[1];
- double diffZ = nearCoords[2] - farCoords[2];
- double rayLength = Math.sqrt(Math.pow(diffX, 2) + Math.pow(diffY, 2) + Math.pow(diffZ, 2));
- System.out.println("rayLength: " + rayLength);
- pickPointTrigger = false;
- }
- GLU.gluPerspective(gl, 55.0f, (float) screenWidth / (float) screenHeight, 1.0f ,100.0f);
- .....
- 07-18 11:23:50.430: INFO/System.out(31795): Near: 57.574852,-88.60514,37.272636
- 07-18 11:23:50.430: INFO/System.out(31795): Far: 0.57574844,0.098602295,0.2700405
- 07-18 11:23:50.430: INFO/System.out(31795): rayLength: 111.74275719790872
- GLU.gluPerspective(gl, 55.0f, (float) width / (float) height, 10.0f , 1000.0f);
- ...
- 07-18 11:25:12.420: INFO/System.out(31847): Near: 5.7575016,-7.965394,3.6339219
- 07-18 11:25:12.420: INFO/System.out(31847): Far: 0.057574987,0.90500546,-0.06634784
- 07-18 11:25:12.420: INFO/System.out(31847): rayLength: 11.174307289026638
- public float[] unproject(float rx, float ry, float rz) {//TODO Factor in projection matrix
- float[] modelInv = new float[16];
- if (!android.opengl.Matrix.invertM(modelInv, 0, mg.mModelView, 0))
- throw new IllegalArgumentException("ModelView is not invertible.");
- float[] projInv = new float[16];
- if (!android.opengl.Matrix.invertM(projInv, 0, mg.mProjection, 0))
- throw new IllegalArgumentException("Projection is not invertible.");
- float[] combo = new float[16];
- android.opengl.Matrix.multiplyMM(combo, 0, modelInv, 0, projInv, 0);
- float[] result = new float[4];
- float vx = viewport[0];
- float vy = viewport[1];
- float vw = viewport[2];
- float vh = viewport[3];
- float[] rhsVec = {((2*(rx-vx))/vw)-1,((2*(ry-vy))/vh)-1,2*rz-1,1};
- android.opengl.Matrix.multiplyMV(result, 0, combo, 0, rhsVec, 0);
- float d = 1 / result[3];
- float[] endResult = {result[0] * d, result[1] * d, result[2] * d};
- return endResult;
- }
- public float distanceToDepth(float distance) {
- return ((1/fNear) - (1/distance))/((1/fNear) - (1/fFar));
- }
- float[] xyz = {0, 0, 0};
- xyz = unproject(mouseX, viewport[3] - mouseY, 1);
- unproject(mouseX, viewport[3] - mouseY, distanceToDepth(5));
- float[] xyzw = {0, 0, 0, 0};
- android.opengl.GLU.gluUnProject(rx, ry, rz, mg.mModelView, 0, mg.mProjection, 0, this.viewport, 0, xyzw, 0);
- xyzw[0] /= xyzw[3];
- xyzw[1] /= xyzw[3];
- xyzw[2] /= xyzw[3];
- //xyzw[3] /= xyzw[3];
- xyzw[3] = 1;
- return xyzw;
Add Comment
Please, Sign In to add comment