mapv
Version:
a library of geography visualization
114 lines (96 loc) • 3.21 kB
JavaScript
import Con from './sys';
var Camera = function (gl) {
this.gl = gl;
// this.radius = 100;
// this.lon = 0;
// this.lat = 0;
this.radius = 4000
this.lon = 90;
this.lat = 45;
this.transX = 100 * Con.longitudeLatitudeScale;
this.transY = 30 * Con.longitudeLatitudeScale;
var canvas = gl.canvas;
gl.viewport(0, 0, canvas.width, canvas.height);
var pMatrix = mat4.create();
mat4.perspective(pMatrix, 45, canvas.width / canvas.height, 1, 100000.0);
gl.uniformMatrix4fv(gl.uPMatrix, false, pMatrix);
this.computerXYZ();
this.render();
this.init();
}
Camera.prototype.init = function () {
this.drag();
}
Camera.prototype.render = function () {
var mvMatrix = mat4.create();
mat4.lookAt(mvMatrix, [this.x, this.y, this.z], [0, 0, 0], [0, 0, 1]);
this.mvMatrix = mat4.translate(mat4.create(), mvMatrix, [-this.transX, -this.transY, 0])
}
Camera.prototype.drag = function () {
var self = this;
var canvas = this.gl.canvas;
var startX = 0;
var startY = 0;
var which = 1;
var startLon = 0;
var startTransX = 0;
var startTransY = 0;
var startLat = 0;
var canDrag = false;
canvas.addEventListener('mousewheel', function (e) {
self.radius -= event.deltaY;
self.radius = Math.max(10, self.radius);
self.radius = Math.min(100000, self.radius);
self.computerXYZ();
self.render();
});
canvas.addEventListener('mousedown', function (e) {
startX = e.offsetX;
startY = e.offsetY;
startLon = self.lon;
startLat = self.lat;
which = e.which;
startTransX = self.transX;
startTransY = self.transY;
canDrag = true;
window.event.returnValue = false;
return false;
});
canvas.addEventListener('contextmenu', () => {
window.event.returnValue = false;
return false;
})
window.addEventListener('mousemove', function (e) {
if (canDrag) {
var dX = e.offsetX - startX;
var dY = e.offsetY - startY;
if (e.which === 1) {
var dLon = dX / 1;
var dLat = dY / 1;
self.lon = (startLon + dLon) % 360;
self.lat = startLat + dLat;
self.lat = Math.min(90, self.lat);
self.lat = Math.max(-90, self.lat);
self.lat = Math.max(10, self.lat);
} else {
self.transX = (startTransX - dX * Con.longitudeLatitudeScale / 10);
self.transY = (startTransY + dY * Con.longitudeLatitudeScale / 10);
}
self.computerXYZ();
self.render();
}
});
window.addEventListener('mouseup', function (e) {
startX = 0;
startY = 0;
canDrag = false;
});
}
Camera.prototype.computerXYZ = function () {
var self = this;
self.z = self.radius * Math.sin(self.lat * Math.PI / 180);
var smallRadius = self.radius * Math.cos(self.lat * Math.PI / 180);
self.x = smallRadius * Math.cos(self.lon * Math.PI / 180);
self.y = -smallRadius * Math.sin(self.lon * Math.PI / 180);
}
export default Camera;