1
0
Fork 0
mirror of https://github.com/vanitasvitae/Spherical synced 2024-11-25 13:52:07 +01:00

Something is broken, but we are not sure and too dizzy to find out :(

This commit is contained in:
Paul Schaub 2018-02-20 18:59:08 +01:00
parent 42c11c185d
commit cdda1317a6
Signed by: vanitasvitae
GPG key ID: 62BEE9264BF17311
2 changed files with 52 additions and 19 deletions

View file

@ -57,6 +57,7 @@ public class PhotoSphereRenderer implements GLSurfaceView.Renderer {
// Store a photoSphereGeometry geometry as framework for the photo texture. // Store a photoSphereGeometry geometry as framework for the photo texture.
private PhotoSphereGeometry photoSphereGeometry = null; private PhotoSphereGeometry photoSphereGeometry = null;
public float [] points = new float[4];
// Store projection matrix. // Store projection matrix.
private float projectionMatrix[] = new float [16]; private float projectionMatrix[] = new float [16];
@ -65,7 +66,9 @@ public class PhotoSphereRenderer implements GLSurfaceView.Renderer {
private float modelMatrix[] = new float [16]; private float modelMatrix[] = new float [16];
// Store view matrix. // Store view matrix.
// private float viewMatrix [] = new float [16]; private float viewMatrix [] = new float [16];
private float modelViewMatrix [] = new float[16];
// Store the model view projection matrix. // Store the model view projection matrix.
private float mvpMatrix [] = new float [32]; private float mvpMatrix [] = new float [32];
@ -114,8 +117,15 @@ public class PhotoSphereRenderer implements GLSurfaceView.Renderer {
if(requestedBitmap != null) if(requestedBitmap != null)
uploadImage(); uploadImage();
// DEBUG - BEGIN
Matrix.setRotateM(modelMatrix, 0, 90, 1.0f, 0.0f, 0.0f);
System.arraycopy(surfaceView.getRotationMatrix(), 0, viewMatrix, 0, 16);
Matrix.multiplyMM(modelViewMatrix, 0, viewMatrix, 0, modelMatrix, 0);
Matrix.scaleM(modelViewMatrix, 0, -1, -1, -1);
// DEBUG - END
// Update transformation matrix. // Update transformation matrix.
Matrix.multiplyMM(mvpMatrix, 16, surfaceView.getRotationMatrix(), 0, modelMatrix, 0); Matrix.multiplyMM(mvpMatrix, 16, viewMatrix, 0, modelMatrix, 0);
//Matrix.multiplyMM(mvpMatrix, 0, viewMatrix, 0, mvpMatrix, 0); //Matrix.multiplyMM(mvpMatrix, 0, viewMatrix, 0, mvpMatrix, 0);
Matrix.multiplyMM(mvpMatrix, 0, projectionMatrix, 0, mvpMatrix, 16); Matrix.multiplyMM(mvpMatrix, 0, projectionMatrix, 0, mvpMatrix, 16);
@ -135,6 +145,16 @@ public class PhotoSphereRenderer implements GLSurfaceView.Renderer {
glDrawElements(GL_TRIANGLES, photoSphereGeometry.getIndexBuffer().capacity(), GL_UNSIGNED_SHORT, photoSphereGeometry.getIndexBuffer()); glDrawElements(GL_TRIANGLES, photoSphereGeometry.getIndexBuffer().capacity(), GL_UNSIGNED_SHORT, photoSphereGeometry.getIndexBuffer());
glBindTexture(GL_TEXTURE_2D, 0); glBindTexture(GL_TEXTURE_2D, 0);
// DEBUG - BEGIN
//Matrix.multiplyMV(res, 0, viewMatrix, 0, points, 0);
Matrix.translateM(modelMatrix, 0, points[0], points[1], points[2]);
Matrix.scaleM(modelMatrix, 0, 0.1f, 0.1f, 0.1f);
Matrix.multiplyMM(mvpMatrix, 16, viewMatrix, 0, modelMatrix, 0);
Matrix.multiplyMM(mvpMatrix, 0, projectionMatrix, 0, mvpMatrix, 16);
glUniformMatrix4fv(mvpLocation, 1, false, mvpMatrix, 0);
glDrawElements(GL_TRIANGLES, photoSphereGeometry.getIndexBuffer().capacity(), GL_UNSIGNED_SHORT, photoSphereGeometry.getIndexBuffer());
// DEBUG - END
glDisableVertexAttribArray(textureCoordinatesLocation); glDisableVertexAttribArray(textureCoordinatesLocation);
glDisableVertexAttribArray(positionLocation); glDisableVertexAttribArray(positionLocation);
@ -169,8 +189,8 @@ public class PhotoSphereRenderer implements GLSurfaceView.Renderer {
// Set OpenGL state. // Set OpenGL state.
glClearColor(1.0f, 0.0f, 0.0f, 1.0f); glClearColor(1.0f, 0.0f, 0.0f, 1.0f);
glEnable(GL_DEPTH_TEST); glEnable(GL_DEPTH_TEST);
//glEnable(GL_CULL_FACE);
glDisable(GL_CULL_FACE); glDisable(GL_CULL_FACE);
//glEnable(GL_CULL_FACE);
//glFrontFace(GL_CW); //glFrontFace(GL_CW);
glActiveTexture(GL_TEXTURE0); glActiveTexture(GL_TEXTURE0);
@ -181,6 +201,7 @@ public class PhotoSphereRenderer implements GLSurfaceView.Renderer {
glGenTextures(1, textureID, 0); glGenTextures(1, textureID, 0);
// Initialize matrices. // Initialize matrices.
Matrix.setIdentityM(modelViewMatrix, 0);
Matrix.setRotateM(modelMatrix, 0, 90, 1.0f, 0.0f, 0.0f); Matrix.setRotateM(modelMatrix, 0, 90, 1.0f, 0.0f, 0.0f);
//Matrix.setLookAtM(viewMatrix, 0, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f); //Matrix.setLookAtM(viewMatrix, 0, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f);
} }
@ -236,12 +257,13 @@ public class PhotoSphereRenderer implements GLSurfaceView.Renderer {
* @param outRayDirection will be filled by the direction of the ray * @param outRayDirection will be filled by the direction of the ray
*/ */
public void getRay(float x, float y, float [] outRayStart, float [] outRayDirection) { public void getRay(float x, float y, float [] outRayStart, float [] outRayDirection) {
GLU.gluUnProject(x, y, 0.0f, modelMatrix, 0, projectionMatrix, 0, view, 0, outRayStart, 0); Matrix.setIdentityM(modelMatrix, 0); // HACK
GLU.gluUnProject(x, y, 1.0f, modelMatrix, 0, projectionMatrix, 0, view, 0, outRayDirection, 0); GLU.gluUnProject(x, view[3] - y - 1, 0.0f, modelMatrix, 0, projectionMatrix, 0, view, 0, outRayStart, 0);
GLU.gluUnProject(x, view[3] - y - 1, 1.0f, modelMatrix, 0, projectionMatrix, 0, view, 0, outRayDirection, 0);
} }
/** /**
* Builds a shader program given vertex and fragment shader soruce. * Builds a shader program given vertex and fragment shader source.
* @param vertexSource The vertex shader source * @param vertexSource The vertex shader source
* @param fragmentSource The fragment shader source * @param fragmentSource The fragment shader source
* @return shader program * @return shader program

View file

@ -9,6 +9,7 @@ import android.hardware.SensorManager;
import android.opengl.GLSurfaceView; import android.opengl.GLSurfaceView;
import android.opengl.Matrix; import android.opengl.Matrix;
import android.os.Build; import android.os.Build;
import android.util.Log;
import android.view.MotionEvent; import android.view.MotionEvent;
/** /**
@ -64,7 +65,7 @@ public class PhotoSphereSurfaceView extends GLSurfaceView implements SensorEvent
if(!useTouchInput) if(!useTouchInput)
return true; return true;
/*
// Retrieve ray in world space. // Retrieve ray in world space.
renderer.getRay(event.getX(), event.getY(), rayStart, rayDirection); renderer.getRay(event.getX(), event.getY(), rayStart, rayDirection);
@ -80,7 +81,8 @@ public class PhotoSphereSurfaceView extends GLSurfaceView implements SensorEvent
// Since the conditions are // Since the conditions are
if(D < 0) { if(D < 0) {
throw new RuntimeException("Ray must intersect with sphere, check camera position"); D = -D;
//throw new RuntimeException("Ray must intersect with sphere, check camera position");
} }
D = (float) Math.sqrt(D); D = (float) Math.sqrt(D);
@ -90,12 +92,11 @@ public class PhotoSphereSurfaceView extends GLSurfaceView implements SensorEvent
float px = rayStart[0] + t*rayDirection[0]; float px = rayStart[0] + t*rayDirection[0];
float py = rayStart[1] + t*rayDirection[1]; float py = rayStart[1] + t*rayDirection[1];
float pz = rayStart[2] + t*rayDirection[2]; float pz = rayStart[2] + t*rayDirection[2];
synchronized (rotationMatrix) {
Matrix.translateM(rotationMatrix, 0, px, py, pz);
}
*/
/* /*
renderer.points[0] = px;
renderer.points[1] = py;
renderer.points[2] = pz;
*/
// Calculate angles. // Calculate angles.
float angleY = (float) Math.toDegrees(Math.atan2(pz, px)); float angleY = (float) Math.toDegrees(Math.atan2(pz, px));
float angleXZ = (float) Math.toDegrees(Math.acos(py)); float angleXZ = (float) Math.toDegrees(Math.acos(py));
@ -106,17 +107,22 @@ public class PhotoSphereSurfaceView extends GLSurfaceView implements SensorEvent
oldAngleXZ = angleXZ; oldAngleXZ = angleXZ;
System.arraycopy(getRotationMatrix(), 0, tempMatrix, 0, 16); System.arraycopy(getRotationMatrix(), 0, tempMatrix, 0, 16);
break; break;
case MotionEvent.ACTION_MOVE:
case MotionEvent.ACTION_MOVE:
synchronized (rotationMatrix) { synchronized (rotationMatrix) {
System.arraycopy(tempMatrix, 0, rotationMatrix, 0, 16); System.arraycopy(tempMatrix, 0, rotationMatrix, 0, 16);
//Matrix.rotateM(rotationMatrix, 0, oldAngleY-angleY, 0.0f, 1.0f, 0.0f); float[] s = new float[16];
Matrix.rotateM(rotationMatrix, 0, oldAngleXZ-angleXZ, 1.0f, 0.0f, 0.0f); Matrix.setIdentityM(s, 0);
//Matrix.setLookAtM(rotationMatrix, 0, 0.0f, 0.0f, 0.0f, px, py, pz, 1.0f, 0.0f, 0.0f); Matrix.rotateM(s, 0, oldAngleY + angleY, 0, 1 ,0);
Matrix.rotateM(s, 0, oldAngleXZ + angleXZ, 1, 0, 1);
System.arraycopy(s, 0, rotationMatrix, 0, 16);
//Matrix.rotateM(rotationMatrix, 0, (oldAngleY-angleY), px, 0.0f, pz);
//Matrix.rotateM(rotationMatrix, 0, oldAngleXZ-angleXZ, 0.0f, 1.0f, 0.0f);
//Matrix.setLookAtM(rotationMatrix, 0, 0.0f, 0.0f, 0.0f, , py, 0, 1.0f, 0.0f, 0.0f);
} }
break; break;
} }
*/
return true; return true;
} }
@ -161,6 +167,11 @@ public class PhotoSphereSurfaceView extends GLSurfaceView implements SensorEvent
*/ */
public void setUseTouchInput(boolean useTouchInput) { public void setUseTouchInput(boolean useTouchInput) {
this.useTouchInput = useTouchInput; this.useTouchInput = useTouchInput;
if(useTouchInput) {
synchronized (rotationMatrix) {
Matrix.setIdentityM(rotationMatrix, 0);
}
}
} }
/** /**