浏览代码

Added setViewOffset to Camera for multi-monitor displays.

Examples in another commit
Gregg Tavares 14 年之前
父节点
当前提交
b380dd4534
共有 1 个文件被更改,包括 71 次插入1 次删除
  1. 71 1
      src/cameras/Camera.js

+ 71 - 1
src/cameras/Camera.js

@@ -41,7 +41,77 @@ THREE.Camera.prototype.translate = function ( distance, axis ) {
 
 
 THREE.Camera.prototype.updateProjectionMatrix = function () {
 THREE.Camera.prototype.updateProjectionMatrix = function () {
 
 
-	this.projectionMatrix = THREE.Matrix4.makePerspective( this.fov, this.aspect, this.near, this.far );
+	if ( this.fullWidth ) {
+
+		var aspect = this.fullWidth / this.fullHeight;
+		var top = Math.tan(this.fov * Math.PI / 360) * this.near;
+		var bottom = -top;
+		var left = aspect * bottom;
+		var right = aspect * top;
+		var width = Math.abs(right - left);
+		var height = Math.abs(top - bottom);
+
+		this.projectionMatrix = THREE.Matrix4.makeFrustum(
+			left + this.x * width / this.fullWidth,
+			left + (this.x + this.width) * width / this.fullWidth,
+			top - (this.y + this.height) * height / this.fullHeight,
+			top - this.y * height / this.fullHeight,
+			this.near,
+			this.far);
+
+	} else {
+
+		this.projectionMatrix = THREE.Matrix4.makePerspective( this.fov, this.aspect, this.near, this.far );
+
+	}
+
+};
+
+/**
+ * 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 monitor 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.Camera.prototype.setViewOffset = function( fullWidth, fullHeight, x, y, width, height ) {
+
+	this.fullWidth = fullWidth;
+	this.fullHeight = fullHeight;
+	this.x = x;
+	this.y = y;
+	this.width = width;
+	this.height = height;
+
+	this.updateProjectionMatrix();
 
 
 };
 };