public void checkThirtyDegreeRule( ArrayList<Cam> cameras, ArrayList<Character> characters, int selectedIdx) { if (cameras == null || cameras.isEmpty()) { println("No cameras in the scene!"); } if (characters.size() != 2) { println("Only two characters supported for now"); // TODO (sanjeet): Hack! Fix this once more characters are allowed } Cam selectedCamera = cameras.get(selectedIdx); // TODO The characters.get results in a runtime error because there aren't currently any // characters allocated in the input file. Character ch1 = characters.get(0); Character ch2 = characters.get(1); // Obtaining (x,y,z) for characters and selected camera PVector ch1Location = ch1.getTranslation(); PVector ch2Location = ch2.getTranslation(); PVector selectedCameraLocation = selectedCamera.getTranslation(); PVector cameraPoint = new PVector(); cameraPoint.add(selectedCameraLocation); for (int i = 0; i < 100; i++) { cameraPoint.add(selectedCamera.getZAxis()); } PVector intersection = getTwoLinesIntersection( new PVector(ch1Location.x, ch1Location.z), new PVector(ch2Location.x, ch2Location.z), new PVector(selectedCameraLocation.x, selectedCameraLocation.z), new PVector(cameraPoint.x, cameraPoint.z)); PVector diff = PVector.sub(selectedCameraLocation, intersection); diff.normalize(); FloatBuffer fb = selectedCamera.modelViewMatrix; float[] mat = fb.array(); float[] fbMatrix = new float[mat.length]; for (int i = 0; i < fbMatrix.length; i++) { fbMatrix[i] = mat[i]; } fbMatrix[0] = -diff.x; fbMatrix[1] = diff.y; fbMatrix[2] = -diff.z; fbMatrix[9] = diff.x; fbMatrix[10] = diff.y; fbMatrix[11] = diff.z; fbMatrix[13] = intersection.x; fbMatrix[14] = intersection.y; fbMatrix[15] = intersection.z; PMatrix3D matrix = new PMatrix3D(); matrix.set(fbMatrix); matrix.transpose(); pushMatrix(); applyMatrix(matrix); rotateY(radians(30)); line(0, 0, 0, 0, 0, 1000); rotateY(radians(-2 * 30)); line(0, 0, 0, 0, 0, 1000); popMatrix(); for (int i = 0; i < cameras.size(); i++) { if (i == selectedIdx) { continue; } if (!cameras.get(i).isInView(ch1Location) && !cameras.get(i).isInView(ch2Location)) { continue; } PVector currCamLocation = cameras.get(i).getTranslation(); PVector vect1 = PVector.sub(currCamLocation, intersection); PVector vect2 = PVector.sub(selectedCameraLocation, intersection); float dotP = vect1.dot(vect2) / (vect1.mag() * vect2.mag()); if (acos(dotP) <= PI / 6) { cameras.get(i).setColor(255, 0, 0); } else { cameras.get(i).setColor(0, 0, 255); } } }
public void display() { pushMatrix(); // println("Yo! Camera!"); // printCamera(); // // println("BAH! Modelview!"); // printMatrix(); stroke(0); // lights(); // translate(160, 160, 0); float[] matrix = modelViewMatrix.array(); // translate(matrix[12], matrix[13], matrix[14]); // rotateY(acos(matrix[0])); // rotateX(asin(matrix[1])); PMatrix3D myMatrix; myMatrix = new PMatrix3D(); myMatrix.set(matrix); /* println("GAA! Transform Matrix"); for (int i=0;i<16;i++){ print(matrix[i]); print (" "); if ((i+1)%4==0) println(""); } println(""); */ myMatrix.transpose(); applyMatrix(myMatrix); /* a and d stuff println("HRMPF! DrawPosition"); printMatrix(); //rotAngle should be 0 and grow by pressing a and shrink by pressing d rotateY(rotAngle); PMatrix3D anotherMatrix=new PMatrix3D(); getMatrix(anotherMatrix); //actually new global transformation for your camera: globalTransform = anotherMatrix * foRealCameraMatrix.invert(); */ line(0, 0, 0, 0, 0, 100); fill(col); box(boxScale); if (isSelected) { rotateY(radians(fov)); line(0, 0, 0, 0, 0, 1000); rotateY(radians(-2 * fov)); line(0, 0, 0, 0, 0, 1000); } if (false) { // float[] matrix1 = modelViewMatrix.array(); fill(color(255, 0, 255)); ellipse(matrix[12], -matrix[14], 20, 20); } popMatrix(); }