itowns
Version:
A JS/WebGL framework for 3D geospatial data visualization
179 lines (151 loc) • 6.85 kB
JavaScript
"use strict";
var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard");
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports["default"] = void 0;
var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn"));
var _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime/helpers/assertThisInitialized"));
var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
var _get2 = _interopRequireDefault(require("@babel/runtime/helpers/get"));
var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
var THREE = _interopRequireWildcard(require("three"));
var Distortion =
/*#__PURE__*/
function () {
function Distortion(size) {
(0, _classCallCheck2["default"])(this, Distortion);
this.size = size;
this.pps = null;
this.polynom = null;
this.l1l2 = null;
}
(0, _createClass2["default"])(Distortion, [{
key: "setFromMicmacCalibration",
value: function setFromMicmacCalibration(distortion) {
var imageYDown = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
this.pps = new THREE.Vector2().fromArray(distortion.pps);
this.polynom = new THREE.Vector4().fromArray(distortion.poly357);
this.l1l2 = new THREE.Vector3(); // inverse Y pps convention image micmac
this.pps.y = imageYDown ? this.size.y - this.pps.y : this.pps.y;
this.polynom.w = Math.pow(distortion.limit, 2);
if (distortion.l1l2) {
this.l1l2.fromArray(distortion.l1l2);
this.l1l2.z = distortion.etats;
}
}
}, {
key: "clone",
value: function clone() {
var dest = new Distortion(this.size.clone());
dest.pps = this.pps.clone();
dest.polynom = this.polynom.clone();
dest.l1l2 = this.l1l2.clone();
return dest;
}
}]);
return Distortion;
}();
var zoom = new THREE.Vector3();
/**
* @classdesc OrientedImageCamera is a ThreeJs camera adapted to photogrammetric description.
* So we can build a ThreeJs perspective camera from size and focal information.
*/
var OrientedImageCamera =
/*#__PURE__*/
function (_THREE$PerspectiveCam) {
(0, _inherits2["default"])(OrientedImageCamera, _THREE$PerspectiveCam);
/**
* @constructor
* @param {number|Vector2} size - image size in pixels (default: x=1024, y=x)
* @param {number|Vector2} focal - focal length in pixels (default: x=1024, y=x)
* @param {Vector2} center - principal point in pixels (default: size/2)
* @param {number} near - Camera frustum near plane (default: see THREE.PerspectiveCamera).
* @param {number} far - Camera frustum far plane (default: see THREE.PerspectiveCamera).
* @param {number} skew - shear transform parameter (default: 0)
* @param {number} aspect - aspect ratio of the camera (default: size.x/size.y).
*/
function OrientedImageCamera() {
var _this;
var size = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 1024;
var focal = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1024;
var center = arguments.length > 2 ? arguments[2] : undefined;
var near = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 0.1;
var far = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 10000;
var skew = arguments.length > 5 ? arguments[5] : undefined;
var aspect = arguments.length > 6 ? arguments[6] : undefined;
(0, _classCallCheck2["default"])(this, OrientedImageCamera);
size = size.isVector2 ? size : new THREE.Vector2(size, size);
aspect = aspect || size.x / size.y;
_this = (0, _possibleConstructorReturn2["default"])(this, (0, _getPrototypeOf2["default"])(OrientedImageCamera).call(this, undefined, aspect, near, far));
_this.size = size;
_this.focal = focal.isVector2 ? focal : new THREE.Vector2(focal, focal);
_this.center = center || size.clone().multiplyScalar(0.5);
_this.skew = skew || 0;
_this.textureMatrixWorldInverse = new THREE.Matrix4();
Object.defineProperty((0, _assertThisInitialized2["default"])(_this), 'fov', {
get: function get() {
return 2 * THREE.Math.radToDeg(Math.atan2(_this.size.y, 2 * _this.focal.y));
},
// setting the fov overwrites focal.x and focal.y
set: function set(fov) {
var focal = 0.5 * _this.size.y / Math.tan(THREE.Math.degToRad(fov * 0.5));
_this.focal.x = focal;
_this.focal.y = focal;
}
});
_this.distortion = new Distortion(_this.size);
_this.maskPath = undefined;
_this.mask = undefined;
_this.updateProjectionMatrix();
return _this;
} // we override PerspectiveCamera.updateProjectionMatrix to
// update the projection matrix depending on other variables
// focal, center and size...
(0, _createClass2["default"])(OrientedImageCamera, [{
key: "updateProjectionMatrix",
value: function updateProjectionMatrix() {
if (!this.focal) {
return;
}
var near = this.near;
var sx = near / this.focal.x;
var sy = near / this.focal.y;
var left = -sx * this.center.x;
var bottom = -sy * this.center.y;
var right = left + sx * this.size.x;
var top = bottom + sy * this.size.y;
this.projectionMatrix.makePerspective(left, right, top, bottom, near, this.far);
this.projectionMatrix.elements[4] = 2 * this.skew / this.size.x; // take zoom and aspect into account
var textureAspect = this.size.x / this.size.y;
var aspectRatio = this.aspect / textureAspect;
zoom.set(this.zoom, this.zoom, 1);
if (aspectRatio > 1) {
zoom.x /= aspectRatio;
} else {
zoom.y *= aspectRatio;
}
this.projectionMatrix.scale(zoom);
}
}, {
key: "copy",
value: function copy(source, recursive) {
(0, _get2["default"])((0, _getPrototypeOf2["default"])(OrientedImageCamera.prototype), "copy", this).call(this, source, recursive);
this.size = source.size.clone();
this.focal = source.focal.clone();
this.center = source.center.clone();
this.distortion = source.distortion.clone();
this.textureMatrixWorldInverse = source.textureMatrixWorldInverse.clone();
this.skew = source.skew;
this.maskPath = source.maskPath;
this.mask = source.mask;
return this;
}
}]);
return OrientedImageCamera;
}(THREE.PerspectiveCamera);
var _default = OrientedImageCamera;
exports["default"] = _default;