public void calculateFrustum() { calculateFrustum(_frustumNear, _frustumFar); }
mainCamera.set(camera); getWorldTransform().applyInverse(mainCamera.getLocation(), tmp); mainCamera.setLocation(tmp); getWorldTransform().applyInverseVector(mainCamera.getLeft(), tmp); mainCamera.setLeft(tmp); getWorldTransform().applyInverseVector(mainCamera.getUp(), tmp); mainCamera.setUp(tmp); getWorldTransform().applyInverseVector(mainCamera.getDirection(), tmp); mainCamera.setDirection(tmp); final ReadOnlyVector3 mainCameraLocation = mainCamera.getLocation(); if (mainCameraLocation.getY() > 0.0 && mainCameraLocation.getY() < upperBound + mainCamera.getFrustumNear()) { mainCamera.setLocation(mainCameraLocation.getX(), upperBound + mainCamera.getFrustumNear(), mainCameraLocation.getZ()); } else if (mainCameraLocation.getY() < 0.0 && mainCameraLocation.getY() > -upperBound - mainCamera.getFrustumNear()) { mainCamera.setLocation(mainCameraLocation.getX(), -upperBound - mainCamera.getFrustumNear(), mainCameraLocation.getZ()); mainCamera.calculateFrustum(); final Vector3[] corners = mainCamera.getCorners();
_corners[7].addLocal(-_extents.getX(), -_extents.getY(), -_extents.getZ()); final ReadOnlyMatrix4 mvMatrix = getViewMatrix(); double optimalCameraNear = Double.MAX_VALUE; double optimalCameraFar = -Double.MAX_VALUE; optimalCameraNear = Math.min(Math.max(getFrustumNear(), optimalCameraNear), getFrustumFar()); optimalCameraFar = Math.max(optimalCameraNear, Math.min(getFrustumFar(), optimalCameraFar)); setFrustumLeft(getFrustumLeft() * change); setFrustumRight(getFrustumRight() * change); setFrustumTop(getFrustumTop() * change); setFrustumBottom(getFrustumBottom() * change); setFrustumNear(optimalCameraNear); setFrustumFar(optimalCameraFar);
double fFarPlaneWidth = (_frustumRight - _frustumLeft) * fFar * 0.5 / _frustumNear; if (getProjectionMode() == ProjectionMode.Orthographic) { fNearPlaneHeight = (_frustumTop - _frustumBottom) * 0.5; fNearPlaneWidth = (_frustumRight - _frustumLeft) * 0.5; final Vector3 up = Vector3.fetchTempInstance(); direction.set(getDirection()).multiplyLocal(fNear); vNearPlaneCenter.set(getLocation()).addLocal(direction); direction.set(getDirection()).multiplyLocal(fFar); vFarPlaneCenter.set(getLocation()).addLocal(direction); left.set(getLeft()).multiplyLocal(fNearPlaneWidth); up.set(getUp()).multiplyLocal(fNearPlaneHeight); _corners[0].set(vNearPlaneCenter).subtractLocal(left).subtractLocal(up); _corners[1].set(vNearPlaneCenter).subtractLocal(left).addLocal(up); _corners[3].set(vNearPlaneCenter).addLocal(left).subtractLocal(up); left.set(getLeft()).multiplyLocal(fFarPlaneWidth); up.set(getUp()).multiplyLocal(fFarPlaneHeight); _corners[4].set(vFarPlaneCenter).subtractLocal(left).subtractLocal(up); _corners[5].set(vFarPlaneCenter).subtractLocal(left).addLocal(up);
extendedCamera.set(camera); extendedCamera.calculateFrustum(fNear, fFar); final Vector3[] corners = extendedCamera.getCorners(); BufferUtils.setInBuffer(corners[7], verts, 15); BufferUtils.setInBuffer(extendedCamera.getLocation(), verts, 16); BufferUtils.setInBuffer(corners[0], verts, 17); BufferUtils.setInBuffer(extendedCamera.getLocation(), verts, 18); BufferUtils.setInBuffer(corners[1], verts, 19); BufferUtils.setInBuffer(extendedCamera.getLocation(), verts, 20); BufferUtils.setInBuffer(corners[2], verts, 21); BufferUtils.setInBuffer(extendedCamera.getLocation(), verts, 22); BufferUtils.setInBuffer(corners[3], verts, 23);
private void calculateIntersection(final double planeHeight, final ReadOnlyVector2 screenPosition, final ReadOnlyMatrix4 modelViewProjectionInverseMatrix) { origin.set(screenPosition.getX() * 2 - 1, screenPosition.getY() * 2 - 1, -1, 1); direction.set(screenPosition.getX() * 2 - 1, screenPosition.getY() * 2 - 1, 1, 1); modelViewProjectionInverseMatrix.applyPre(origin, origin); modelViewProjectionInverseMatrix.applyPre(direction, direction); direction.subtractLocal(origin); // final double t = (planeHeight * origin.getW() - origin.getY()) // / (direction.getY() - planeHeight * direction.getW()); if (Math.abs(direction.getY()) > MathUtils.EPSILON) { final double t = (planeHeight - origin.getY()) / direction.getY(); direction.multiplyLocal(t); } else { direction.normalizeLocal(); direction.multiplyLocal(mainCamera.getFrustumFar()); } origin.addLocal(direction); }
mainCamera.set(camera); getWorldTransform().applyInverse(mainCamera.getLocation(), tmp); mainCamera.setLocation(tmp); getWorldTransform().applyInverseVector(mainCamera.getLeft(), tmp); mainCamera.setLeft(tmp); getWorldTransform().applyInverseVector(mainCamera.getUp(), tmp); mainCamera.setUp(tmp); getWorldTransform().applyInverseVector(mainCamera.getDirection(), tmp); mainCamera.setDirection(tmp); final ReadOnlyVector3 mainCameraLocation = mainCamera.getLocation(); if (mainCameraLocation.getY() > 0.0 && mainCameraLocation.getY() < upperBound + mainCamera.getFrustumNear()) { mainCamera.setLocation(mainCameraLocation.getX(), upperBound + mainCamera.getFrustumNear(), mainCameraLocation.getZ()); } else if (mainCameraLocation.getY() < 0.0 && mainCameraLocation.getY() > -upperBound - mainCamera.getFrustumNear()) { mainCamera.setLocation(mainCameraLocation.getX(), -upperBound - mainCamera.getFrustumNear(), mainCameraLocation.getZ()); mainCamera.calculateFrustum(); final Vector3[] corners = mainCamera.getCorners();
_corners[7].addLocal(-_extents.getX(), -_extents.getY(), -_extents.getZ()); final ReadOnlyMatrix4 mvMatrix = getModelViewMatrix(); double optimalCameraNear = Double.MAX_VALUE; double optimalCameraFar = -Double.MAX_VALUE; optimalCameraNear = Math.min(Math.max(getFrustumNear(), optimalCameraNear), getFrustumFar()); optimalCameraFar = Math.max(optimalCameraNear, Math.min(getFrustumFar(), optimalCameraFar)); setFrustumLeft(getFrustumLeft() * change); setFrustumRight(getFrustumRight() * change); setFrustumTop(getFrustumTop() * change); setFrustumBottom(getFrustumBottom() * change); setFrustumNear(optimalCameraNear); setFrustumFar(optimalCameraFar);
double fFarPlaneWidth = (_frustumRight - _frustumLeft) * fFar * 0.5 / _frustumNear; if (getProjectionMode() == ProjectionMode.Parallel) { fNearPlaneHeight = (_frustumTop - _frustumBottom) * 0.5; fNearPlaneWidth = (_frustumRight - _frustumLeft) * 0.5; final Vector3 up = Vector3.fetchTempInstance(); direction.set(getDirection()).multiplyLocal(fNear); vNearPlaneCenter.set(getLocation()).addLocal(direction); direction.set(getDirection()).multiplyLocal(fFar); vFarPlaneCenter.set(getLocation()).addLocal(direction); left.set(getLeft()).multiplyLocal(fNearPlaneWidth); up.set(getUp()).multiplyLocal(fNearPlaneHeight); _corners[0].set(vNearPlaneCenter).subtractLocal(left).subtractLocal(up); _corners[1].set(vNearPlaneCenter).subtractLocal(left).addLocal(up); _corners[3].set(vNearPlaneCenter).addLocal(left).subtractLocal(up); left.set(getLeft()).multiplyLocal(fFarPlaneWidth); up.set(getUp()).multiplyLocal(fFarPlaneHeight); _corners[4].set(vFarPlaneCenter).subtractLocal(left).subtractLocal(up); _corners[5].set(vFarPlaneCenter).subtractLocal(left).addLocal(up);
lineFrustum.setStipplePattern(pattern); extendedCamera.set(camera); extendedCamera.calculateFrustum(fNear, fFar); final Vector3[] corners = extendedCamera.getCorners(); BufferUtils.setInBuffer(corners[7], verts, 15); BufferUtils.setInBuffer(extendedCamera.getLocation(), verts, 16); BufferUtils.setInBuffer(corners[0], verts, 17); BufferUtils.setInBuffer(extendedCamera.getLocation(), verts, 18); BufferUtils.setInBuffer(corners[1], verts, 19); BufferUtils.setInBuffer(extendedCamera.getLocation(), verts, 20); BufferUtils.setInBuffer(corners[2], verts, 21); BufferUtils.setInBuffer(extendedCamera.getLocation(), verts, 22); BufferUtils.setInBuffer(corners[3], verts, 23);
private void calculateIntersection(final double planeHeight, final ReadOnlyVector2 screenPosition, final ReadOnlyMatrix4 modelViewProjectionInverseMatrix) { origin.set(screenPosition.getX() * 2 - 1, screenPosition.getY() * 2 - 1, -1, 1); direction.set(screenPosition.getX() * 2 - 1, screenPosition.getY() * 2 - 1, 1, 1); modelViewProjectionInverseMatrix.applyPre(origin, origin); modelViewProjectionInverseMatrix.applyPre(direction, direction); direction.subtractLocal(origin); // final double t = (planeHeight * origin.getW() - origin.getY()) // / (direction.getY() - planeHeight * direction.getW()); if (Math.abs(direction.getY()) > MathUtils.EPSILON) { final double t = (planeHeight - origin.getY()) / direction.getY(); direction.multiplyLocal(t); } else { direction.normalizeLocal(); direction.multiplyLocal(mainCamera.getFrustumFar()); } origin.addLocal(direction); }
public void calculateFrustum() { calculateFrustum(_frustumNear, _frustumFar); }