-
-
Notifications
You must be signed in to change notification settings - Fork 35.5k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
PerspectiveCamera: Moved frameCorners() to CameraUtils in examples.
- Loading branch information
Showing
9 changed files
with
202 additions
and
78 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,29 @@ | ||
<!DOCTYPE html> | ||
<html lang="en"> | ||
<head> | ||
<meta charset="utf-8" /> | ||
<base href="../../../" /> | ||
<script src="page.js"></script> | ||
<link type="text/css" rel="stylesheet" href="page.css" /> | ||
</head> | ||
<body> | ||
<h1>[name]</h1> | ||
|
||
<p class="desc">A class containing useful utility functions for camera manipulation.</p> | ||
|
||
|
||
<h2>Methods</h2> | ||
|
||
<h3>[method:null frameCorners]( [param:PerspectiveCamera camera] [param:Vector3 bottomLeftCorner], [param:Vector3 bottomRightCorner], [param:Vector3 topLeftCorner], [param:boolean estimateViewFrustum] )</h3> | ||
<p> | ||
Set a PerspectiveCamera's projectionMatrix and quaternion to exactly frame the corners of an arbitrary rectangle using [link:https://web.archive.org/web/20191110002841/http://csc.lsu.edu/~kooima/articles/genperspective/index.html Kooima's Generalized Perspective Projection formulation]. | ||
NOTE: This function ignores the standard parameters; do not call updateProjectionMatrix() after this! toJSON will also not capture the off-axis matrix generated by this function. | ||
</p> | ||
|
||
<h2>Source</h2> | ||
|
||
<p> | ||
[link:https://github.com/mrdoob/three.js/blob/master/examples/jsm/utils/CameraUtils.js examples/jsm/utils/CameraUtils.js] | ||
</p> | ||
</body> | ||
</html> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,88 @@ | ||
( function () { | ||
|
||
const _va = /*@__PURE__*/new THREE.Vector3(), | ||
// from pe to pa | ||
_vb = /*@__PURE__*/new THREE.Vector3(), | ||
// from pe to pb | ||
_vc = /*@__PURE__*/new THREE.Vector3(), | ||
// from pe to pc | ||
_vr = /*@__PURE__*/new THREE.Vector3(), | ||
// right axis of screen | ||
_vu = /*@__PURE__*/new THREE.Vector3(), | ||
// up axis of screen | ||
_vn = /*@__PURE__*/new THREE.Vector3(), | ||
// normal vector of screen | ||
_vec = /*@__PURE__*/new THREE.Vector3(), | ||
// temporary vector | ||
_quat = /*@__PURE__*/new THREE.Quaternion(); // temporary quaternion | ||
|
||
|
||
class CameraUtils { | ||
|
||
/** Set a PerspectiveCamera's projectionMatrix and quaternion | ||
* to exactly frame the corners of an arbitrary rectangle. | ||
* NOTE: This function ignores the standard parameters; | ||
* do not call updateProjectionMatrix() after this! | ||
* @param {Vector3} bottomLeftCorner | ||
* @param {Vector3} bottomRightCorner | ||
* @param {Vector3} topLeftCorner | ||
* @param {boolean} estimateViewFrustum */ | ||
static frameCorners( camera, bottomLeftCorner, bottomRightCorner, topLeftCorner, estimateViewFrustum = false ) { | ||
|
||
const pa = bottomLeftCorner, | ||
pb = bottomRightCorner, | ||
pc = topLeftCorner; | ||
const pe = camera.position; // eye position | ||
|
||
const n = camera.near; // distance of near clipping plane | ||
|
||
const f = camera.far; //distance of far clipping plane | ||
|
||
_vr.copy( pb ).sub( pa ).normalize(); | ||
|
||
_vu.copy( pc ).sub( pa ).normalize(); | ||
|
||
_vn.crossVectors( _vr, _vu ).normalize(); | ||
|
||
_va.copy( pa ).sub( pe ); // from pe to pa | ||
|
||
|
||
_vb.copy( pb ).sub( pe ); // from pe to pb | ||
|
||
|
||
_vc.copy( pc ).sub( pe ); // from pe to pc | ||
|
||
|
||
const d = - _va.dot( _vn ); // distance from eye to screen | ||
|
||
const l = _vr.dot( _va ) * n / d; // distance to left screen edge | ||
|
||
const r = _vr.dot( _vb ) * n / d; // distance to right screen edge | ||
|
||
const b = _vu.dot( _va ) * n / d; // distance to bottom screen edge | ||
|
||
const t = _vu.dot( _vc ) * n / d; // distance to top screen edge | ||
// Set the camera rotation to match the focal plane to the corners' plane | ||
|
||
_quat.setFromUnitVectors( _vec.set( 0, 1, 0 ), _vu ); | ||
|
||
camera.quaternion.setFromUnitVectors( _vec.set( 0, 0, 1 ).applyQuaternion( _quat ), _vn ).multiply( _quat ); // Set the off-axis projection matrix to match the corners | ||
|
||
camera.projectionMatrix.set( 2.0 * n / ( r - l ), 0.0, ( r + l ) / ( r - l ), 0.0, 0.0, 2.0 * n / ( t - b ), ( t + b ) / ( t - b ), 0.0, 0.0, 0.0, ( f + n ) / ( n - f ), 2.0 * f * n / ( n - f ), 0.0, 0.0, - 1.0, 0.0 ); | ||
camera.projectionMatrixInverse.copy( camera.projectionMatrix ).invert(); // FoV estimation to fix frustum culling | ||
|
||
if ( estimateViewFrustum ) { | ||
|
||
// Set fieldOfView to a conservative estimate | ||
// to make frustum tall/wide enough to encompass it | ||
camera.fov = THREE.MathUtils.RAD2DEG / Math.min( 1.0, camera.aspect ) * Math.atan( ( _vec.copy( pb ).sub( pa ).length() + _vec.copy( pc ).sub( pa ).length() ) / _va.length() ); | ||
|
||
} | ||
|
||
} | ||
|
||
} | ||
|
||
THREE.CameraUtils = CameraUtils; | ||
|
||
} )(); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,76 @@ | ||
import { | ||
MathUtils, | ||
Quaternion, | ||
Vector3 | ||
} from '../../../build/three.module.js'; | ||
|
||
const _va = /*@__PURE__*/ new Vector3(), // from pe to pa | ||
_vb = /*@__PURE__*/ new Vector3(), // from pe to pb | ||
_vc = /*@__PURE__*/ new Vector3(), // from pe to pc | ||
_vr = /*@__PURE__*/ new Vector3(), // right axis of screen | ||
_vu = /*@__PURE__*/ new Vector3(), // up axis of screen | ||
_vn = /*@__PURE__*/ new Vector3(), // normal vector of screen | ||
_vec = /*@__PURE__*/ new Vector3(), // temporary vector | ||
_quat = /*@__PURE__*/ new Quaternion(); // temporary quaternion | ||
|
||
class CameraUtils { | ||
|
||
/** Set a PerspectiveCamera's projectionMatrix and quaternion | ||
* to exactly frame the corners of an arbitrary rectangle. | ||
* NOTE: This function ignores the standard parameters; | ||
* do not call updateProjectionMatrix() after this! | ||
* @param {Vector3} bottomLeftCorner | ||
* @param {Vector3} bottomRightCorner | ||
* @param {Vector3} topLeftCorner | ||
* @param {boolean} estimateViewFrustum */ | ||
static frameCorners( camera, bottomLeftCorner, bottomRightCorner, topLeftCorner, estimateViewFrustum = false ) { | ||
|
||
const pa = bottomLeftCorner, pb = bottomRightCorner, pc = topLeftCorner; | ||
const pe = camera.position; // eye position | ||
const n = camera.near; // distance of near clipping plane | ||
const f = camera.far; //distance of far clipping plane | ||
|
||
_vr.copy( pb ).sub( pa ).normalize(); | ||
_vu.copy( pc ).sub( pa ).normalize(); | ||
_vn.crossVectors( _vr, _vu ).normalize(); | ||
|
||
_va.copy( pa ).sub( pe ); // from pe to pa | ||
_vb.copy( pb ).sub( pe ); // from pe to pb | ||
_vc.copy( pc ).sub( pe ); // from pe to pc | ||
|
||
const d = - _va.dot( _vn ); // distance from eye to screen | ||
const l = _vr.dot( _va ) * n / d; // distance to left screen edge | ||
const r = _vr.dot( _vb ) * n / d; // distance to right screen edge | ||
const b = _vu.dot( _va ) * n / d; // distance to bottom screen edge | ||
const t = _vu.dot( _vc ) * n / d; // distance to top screen edge | ||
|
||
// Set the camera rotation to match the focal plane to the corners' plane | ||
_quat.setFromUnitVectors( _vec.set( 0, 1, 0 ), _vu ); | ||
camera.quaternion.setFromUnitVectors( _vec.set( 0, 0, 1 ).applyQuaternion( _quat ), _vn ).multiply( _quat ); | ||
|
||
// Set the off-axis projection matrix to match the corners | ||
camera.projectionMatrix.set( 2.0 * n / ( r - l ), 0.0, | ||
( r + l ) / ( r - l ), 0.0, 0.0, | ||
2.0 * n / ( t - b ), | ||
( t + b ) / ( t - b ), 0.0, 0.0, 0.0, | ||
( f + n ) / ( n - f ), | ||
2.0 * f * n / ( n - f ), 0.0, 0.0, - 1.0, 0.0 ); | ||
camera.projectionMatrixInverse.copy( camera.projectionMatrix ).invert(); | ||
|
||
// FoV estimation to fix frustum culling | ||
if ( estimateViewFrustum ) { | ||
|
||
// Set fieldOfView to a conservative estimate | ||
// to make frustum tall/wide enough to encompass it | ||
camera.fov = | ||
MathUtils.RAD2DEG / Math.min( 1.0, camera.aspect ) * | ||
Math.atan( ( _vec.copy( pb ).sub( pa ).length() + | ||
( _vec.copy( pc ).sub( pa ).length() ) ) / _va.length() ); | ||
|
||
} | ||
|
||
} | ||
|
||
} | ||
|
||
export { CameraUtils }; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters