|
@@ -28,199 +28,198 @@ THREE.PerspectiveCamera = function( fov, aspect, near, far ) {
|
|
|
|
|
|
};
|
|
|
|
|
|
-THREE.PerspectiveCamera.prototype = Object.create( THREE.Camera.prototype );
|
|
|
-THREE.PerspectiveCamera.prototype.constructor = THREE.PerspectiveCamera;
|
|
|
+THREE.PerspectiveCamera.prototype = Object.assign( Object.create( THREE.Camera.prototype ), {
|
|
|
|
|
|
+ constructor: THREE.PerspectiveCamera,
|
|
|
|
|
|
-/**
|
|
|
- * Sets the FOV by focal length (DEPRECATED).
|
|
|
- *
|
|
|
- * Optionally also sets .filmGauge, otherwise uses it. See .setFocalLength.
|
|
|
- */
|
|
|
-THREE.PerspectiveCamera.prototype.setLens = function( focalLength, filmGauge ) {
|
|
|
+ copy: function ( source ) {
|
|
|
|
|
|
- console.warn( "THREE.PerspectiveCamera.setLens is deprecated. " +
|
|
|
- "Use .setFocalLength and .filmGauge for a photographic setup." );
|
|
|
+ THREE.Camera.prototype.copy.call( this, source );
|
|
|
|
|
|
- if ( filmGauge !== undefined ) this.filmGauge = filmGauge;
|
|
|
- this.setFocalLength( focalLength );
|
|
|
+ this.fov = source.fov;
|
|
|
+ this.zoom = source.zoom;
|
|
|
|
|
|
-};
|
|
|
+ this.near = source.near;
|
|
|
+ this.far = source.far;
|
|
|
+ this.focus = source.focus;
|
|
|
|
|
|
-/**
|
|
|
- * Sets the FOV by focal length in respect to the current .filmGauge.
|
|
|
- *
|
|
|
- * The default film gauge is 35, so that the focal length can be specified for
|
|
|
- * a 35mm (full frame) camera.
|
|
|
- *
|
|
|
- * Values for focal length and film gauge must have the same unit.
|
|
|
- */
|
|
|
-THREE.PerspectiveCamera.prototype.setFocalLength = function( focalLength ) {
|
|
|
+ this.aspect = source.aspect;
|
|
|
+ this.view = source.view === null ? null : Object.assign( {}, source.view );
|
|
|
|
|
|
- // see http://www.bobatkins.com/photography/technical/field_of_view.html
|
|
|
- var vExtentSlope = 0.5 * this.getFilmHeight() / focalLength;
|
|
|
+ this.filmGauge = source.filmGauge;
|
|
|
+ this.filmOffset = source.filmOffset;
|
|
|
|
|
|
- this.fov = THREE.Math.RAD2DEG * 2 * Math.atan( vExtentSlope );
|
|
|
- this.updateProjectionMatrix();
|
|
|
+ return this;
|
|
|
|
|
|
-};
|
|
|
+ },
|
|
|
|
|
|
+ /**
|
|
|
+ * Sets the FOV by focal length (DEPRECATED).
|
|
|
+ *
|
|
|
+ * Optionally also sets .filmGauge, otherwise uses it. See .setFocalLength.
|
|
|
+ */
|
|
|
+ setLens: function ( focalLength, filmGauge ) {
|
|
|
|
|
|
-/**
|
|
|
- * Calculates the focal length from the current .fov and .filmGauge.
|
|
|
- */
|
|
|
-THREE.PerspectiveCamera.prototype.getFocalLength = function() {
|
|
|
+ console.warn( "THREE.PerspectiveCamera.setLens is deprecated. " +
|
|
|
+ "Use .setFocalLength and .filmGauge for a photographic setup." );
|
|
|
|
|
|
- var vExtentSlope = Math.tan( THREE.Math.DEG2RAD * 0.5 * this.fov );
|
|
|
+ if ( filmGauge !== undefined ) this.filmGauge = filmGauge;
|
|
|
+ this.setFocalLength( focalLength );
|
|
|
|
|
|
- return 0.5 * this.getFilmHeight() / vExtentSlope;
|
|
|
+ },
|
|
|
|
|
|
-};
|
|
|
+ /**
|
|
|
+ * Sets the FOV by focal length in respect to the current .filmGauge.
|
|
|
+ *
|
|
|
+ * The default film gauge is 35, so that the focal length can be specified for
|
|
|
+ * a 35mm (full frame) camera.
|
|
|
+ *
|
|
|
+ * Values for focal length and film gauge must have the same unit.
|
|
|
+ */
|
|
|
+ setFocalLength: function ( focalLength ) {
|
|
|
|
|
|
-THREE.PerspectiveCamera.prototype.getEffectiveFOV = function() {
|
|
|
+ // see http://www.bobatkins.com/photography/technical/field_of_view.html
|
|
|
+ var vExtentSlope = 0.5 * this.getFilmHeight() / focalLength;
|
|
|
|
|
|
- return THREE.Math.RAD2DEG * 2 * Math.atan(
|
|
|
- Math.tan( THREE.Math.DEG2RAD * 0.5 * this.fov ) / this.zoom );
|
|
|
+ this.fov = THREE.Math.RAD2DEG * 2 * Math.atan( vExtentSlope );
|
|
|
+ this.updateProjectionMatrix();
|
|
|
|
|
|
-};
|
|
|
+ },
|
|
|
|
|
|
-THREE.PerspectiveCamera.prototype.getFilmWidth = function() {
|
|
|
+ /**
|
|
|
+ * Calculates the focal length from the current .fov and .filmGauge.
|
|
|
+ */
|
|
|
+ getFocalLength: function () {
|
|
|
|
|
|
- // film not completely covered in portrait format (aspect < 1)
|
|
|
- return this.filmGauge * Math.min( this.aspect, 1 );
|
|
|
+ var vExtentSlope = Math.tan( THREE.Math.DEG2RAD * 0.5 * this.fov );
|
|
|
|
|
|
-};
|
|
|
+ return 0.5 * this.getFilmHeight() / vExtentSlope;
|
|
|
|
|
|
-THREE.PerspectiveCamera.prototype.getFilmHeight = function() {
|
|
|
+ },
|
|
|
|
|
|
- // film not completely covered in landscape format (aspect > 1)
|
|
|
- return this.filmGauge / Math.max( this.aspect, 1 );
|
|
|
+ getEffectiveFOV: function () {
|
|
|
|
|
|
-};
|
|
|
+ return THREE.Math.RAD2DEG * 2 * Math.atan(
|
|
|
+ Math.tan( THREE.Math.DEG2RAD * 0.5 * this.fov ) / this.zoom );
|
|
|
|
|
|
+ },
|
|
|
|
|
|
+ getFilmWidth: function () {
|
|
|
|
|
|
-/**
|
|
|
- * Sets an offset in a larger frustum. This is useful for multi-window or
|
|
|
- * multi-monitor/multi-machine setups.
|
|
|
- *
|
|
|
- * For example, if you have 3x2 monitors and each monitor is 1920x1080 and
|
|
|
- * the monitors are in grid like this
|
|
|
- *
|
|
|
- * +---+---+---+
|
|
|
- * | A | B | C |
|
|
|
- * +---+---+---+
|
|
|
- * | D | E | F |
|
|
|
- * +---+---+---+
|
|
|
- *
|
|
|
- * then for each monitor you would call it like this
|
|
|
- *
|
|
|
- * var w = 1920;
|
|
|
- * var h = 1080;
|
|
|
- * var fullWidth = w * 3;
|
|
|
- * var fullHeight = h * 2;
|
|
|
- *
|
|
|
- * --A--
|
|
|
- * camera.setOffset( fullWidth, fullHeight, w * 0, h * 0, w, h );
|
|
|
- * --B--
|
|
|
- * camera.setOffset( fullWidth, fullHeight, w * 1, h * 0, w, h );
|
|
|
- * --C--
|
|
|
- * camera.setOffset( fullWidth, fullHeight, w * 2, h * 0, w, h );
|
|
|
- * --D--
|
|
|
- * camera.setOffset( fullWidth, fullHeight, w * 0, h * 1, w, h );
|
|
|
- * --E--
|
|
|
- * camera.setOffset( fullWidth, fullHeight, w * 1, h * 1, w, h );
|
|
|
- * --F--
|
|
|
- * camera.setOffset( fullWidth, fullHeight, w * 2, h * 1, w, h );
|
|
|
- *
|
|
|
- * Note there is no reason monitors have to be the same size or in a grid.
|
|
|
- */
|
|
|
-THREE.PerspectiveCamera.prototype.setViewOffset = function( fullWidth, fullHeight, x, y, width, height ) {
|
|
|
+ // film not completely covered in portrait format (aspect < 1)
|
|
|
+ return this.filmGauge * Math.min( this.aspect, 1 );
|
|
|
|
|
|
- this.aspect = fullWidth / fullHeight;
|
|
|
+ },
|
|
|
|
|
|
- this.view = {
|
|
|
- fullWidth: fullWidth,
|
|
|
- fullHeight: fullHeight,
|
|
|
- offsetX: x,
|
|
|
- offsetY: y,
|
|
|
- width: width,
|
|
|
- height: height
|
|
|
- };
|
|
|
+ getFilmHeight: function () {
|
|
|
|
|
|
- this.updateProjectionMatrix();
|
|
|
-
|
|
|
-};
|
|
|
-
|
|
|
-THREE.PerspectiveCamera.prototype.updateProjectionMatrix = function() {
|
|
|
-
|
|
|
- var near = this.near,
|
|
|
- top = near * Math.tan(
|
|
|
- THREE.Math.DEG2RAD * 0.5 * this.fov ) / this.zoom,
|
|
|
- height = 2 * top,
|
|
|
- width = this.aspect * height,
|
|
|
- left = - 0.5 * width,
|
|
|
- view = this.view;
|
|
|
-
|
|
|
- if ( view !== null ) {
|
|
|
-
|
|
|
- var fullWidth = view.fullWidth,
|
|
|
- fullHeight = view.fullHeight;
|
|
|
+ // film not completely covered in landscape format (aspect > 1)
|
|
|
+ return this.filmGauge / Math.max( this.aspect, 1 );
|
|
|
|
|
|
- left += view.offsetX * width / fullWidth;
|
|
|
- top -= view.offsetY * height / fullHeight;
|
|
|
- width *= view.width / fullWidth;
|
|
|
- height *= view.height / fullHeight;
|
|
|
+ },
|
|
|
|
|
|
- }
|
|
|
-
|
|
|
- var skew = this.filmOffset;
|
|
|
- if ( skew !== 0 ) left += near * skew / this.getFilmWidth();
|
|
|
+ /**
|
|
|
+ * Sets an offset in a larger frustum. This is useful for multi-window or
|
|
|
+ * multi-monitor/multi-machine setups.
|
|
|
+ *
|
|
|
+ * For example, if you have 3x2 monitors and each monitor is 1920x1080 and
|
|
|
+ * the monitors are in grid like this
|
|
|
+ *
|
|
|
+ * +---+---+---+
|
|
|
+ * | A | B | C |
|
|
|
+ * +---+---+---+
|
|
|
+ * | D | E | F |
|
|
|
+ * +---+---+---+
|
|
|
+ *
|
|
|
+ * then for each monitor you would call it like this
|
|
|
+ *
|
|
|
+ * var w = 1920;
|
|
|
+ * var h = 1080;
|
|
|
+ * var fullWidth = w * 3;
|
|
|
+ * var fullHeight = h * 2;
|
|
|
+ *
|
|
|
+ * --A--
|
|
|
+ * camera.setOffset( fullWidth, fullHeight, w * 0, h * 0, w, h );
|
|
|
+ * --B--
|
|
|
+ * camera.setOffset( fullWidth, fullHeight, w * 1, h * 0, w, h );
|
|
|
+ * --C--
|
|
|
+ * camera.setOffset( fullWidth, fullHeight, w * 2, h * 0, w, h );
|
|
|
+ * --D--
|
|
|
+ * camera.setOffset( fullWidth, fullHeight, w * 0, h * 1, w, h );
|
|
|
+ * --E--
|
|
|
+ * camera.setOffset( fullWidth, fullHeight, w * 1, h * 1, w, h );
|
|
|
+ * --F--
|
|
|
+ * camera.setOffset( fullWidth, fullHeight, w * 2, h * 1, w, h );
|
|
|
+ *
|
|
|
+ * Note there is no reason monitors have to be the same size or in a grid.
|
|
|
+ */
|
|
|
+ setViewOffset: function ( fullWidth, fullHeight, x, y, width, height ) {
|
|
|
|
|
|
- this.projectionMatrix.makeFrustum(
|
|
|
- left, left + width, top - height, top, near, this.far );
|
|
|
+ this.aspect = fullWidth / fullHeight;
|
|
|
|
|
|
-};
|
|
|
+ this.view = {
|
|
|
+ fullWidth: fullWidth,
|
|
|
+ fullHeight: fullHeight,
|
|
|
+ offsetX: x,
|
|
|
+ offsetY: y,
|
|
|
+ width: width,
|
|
|
+ height: height
|
|
|
+ };
|
|
|
|
|
|
-THREE.PerspectiveCamera.prototype.copy = function( source ) {
|
|
|
+ this.updateProjectionMatrix();
|
|
|
|
|
|
- THREE.Camera.prototype.copy.call( this, source );
|
|
|
+ },
|
|
|
|
|
|
- this.fov = source.fov;
|
|
|
- this.zoom = source.zoom;
|
|
|
+ updateProjectionMatrix: function () {
|
|
|
|
|
|
- this.near = source.near;
|
|
|
- this.far = source.far;
|
|
|
- this.focus = source.focus;
|
|
|
+ var near = this.near,
|
|
|
+ top = near * Math.tan(
|
|
|
+ THREE.Math.DEG2RAD * 0.5 * this.fov ) / this.zoom,
|
|
|
+ height = 2 * top,
|
|
|
+ width = this.aspect * height,
|
|
|
+ left = - 0.5 * width,
|
|
|
+ view = this.view;
|
|
|
|
|
|
- this.aspect = source.aspect;
|
|
|
- this.view = source.view === null ? null : Object.assign( {}, source.view );
|
|
|
+ if ( view !== null ) {
|
|
|
|
|
|
- this.filmGauge = source.filmGauge;
|
|
|
- this.filmOffset = source.filmOffset;
|
|
|
+ var fullWidth = view.fullWidth,
|
|
|
+ fullHeight = view.fullHeight;
|
|
|
|
|
|
- return this;
|
|
|
+ left += view.offsetX * width / fullWidth;
|
|
|
+ top -= view.offsetY * height / fullHeight;
|
|
|
+ width *= view.width / fullWidth;
|
|
|
+ height *= view.height / fullHeight;
|
|
|
|
|
|
-};
|
|
|
+ }
|
|
|
|
|
|
-THREE.PerspectiveCamera.prototype.toJSON = function( meta ) {
|
|
|
+ var skew = this.filmOffset;
|
|
|
+ if ( skew !== 0 ) left += near * skew / this.getFilmWidth();
|
|
|
|
|
|
- var data = THREE.Object3D.prototype.toJSON.call( this, meta );
|
|
|
+ this.projectionMatrix.makeFrustum(
|
|
|
+ left, left + width, top - height, top, near, this.far );
|
|
|
|
|
|
- data.object.fov = this.fov;
|
|
|
- data.object.zoom = this.zoom;
|
|
|
+ },
|
|
|
|
|
|
- data.object.near = this.near;
|
|
|
- data.object.far = this.far;
|
|
|
- data.object.focus = this.focus;
|
|
|
+ toJSON: function ( meta ) {
|
|
|
|
|
|
- data.object.aspect = this.aspect;
|
|
|
+ var data = THREE.Object3D.prototype.toJSON.call( this, meta );
|
|
|
|
|
|
- if ( this.view !== null ) data.object.view = Object.assign( {}, this.view );
|
|
|
+ data.object.fov = this.fov;
|
|
|
+ data.object.zoom = this.zoom;
|
|
|
+
|
|
|
+ data.object.near = this.near;
|
|
|
+ data.object.far = this.far;
|
|
|
+ data.object.focus = this.focus;
|
|
|
+
|
|
|
+ data.object.aspect = this.aspect;
|
|
|
+
|
|
|
+ if ( this.view !== null ) data.object.view = Object.assign( {}, this.view );
|
|
|
+
|
|
|
+ data.object.filmGauge = this.filmGauge;
|
|
|
+ data.object.filmOffset = this.filmOffset;
|
|
|
+
|
|
|
+ return data;
|
|
|
|
|
|
- data.object.filmGauge = this.filmGauge;
|
|
|
- data.object.filmOffset = this.filmOffset;
|
|
|
-
|
|
|
- return data;
|
|
|
+ }
|
|
|
|
|
|
-};
|
|
|
+} );
|