CubeCamera.js 3.2 KB
Newer Older
B
bentok 已提交
1 2 3 4 5
import { Object3D } from '../core/Object3D.js';
import { WebGLRenderTargetCube } from '../renderers/WebGLRenderTargetCube.js';
import { LinearFilter, RGBFormat } from '../constants.js';
import { Vector3 } from '../math/Vector3.js';
import { PerspectiveCamera } from './PerspectiveCamera.js';
R
Rich Harris 已提交
6

7 8 9 10 11 12 13
/**
 * Camera for rendering cube maps
 *	- renders scene into axis-aligned cube
 *
 * @author alteredq / http://alteredqualia.com/
 */

W
WestLangley 已提交
14
function CubeCamera( near, far, cubeResolution, options ) {
15

R
Rich Harris 已提交
16
	Object3D.call( this );
17

18 19
	this.type = 'CubeCamera';

20 21
	var fov = 90, aspect = 1;

R
Rich Harris 已提交
22
	var cameraPX = new PerspectiveCamera( fov, aspect, near, far );
23
	cameraPX.up.set( 0, - 1, 0 );
R
Rich Harris 已提交
24
	cameraPX.lookAt( new Vector3( 1, 0, 0 ) );
25
	this.add( cameraPX );
26

R
Rich Harris 已提交
27
	var cameraNX = new PerspectiveCamera( fov, aspect, near, far );
28
	cameraNX.up.set( 0, - 1, 0 );
R
Rich Harris 已提交
29
	cameraNX.lookAt( new Vector3( - 1, 0, 0 ) );
30
	this.add( cameraNX );
31

R
Rich Harris 已提交
32
	var cameraPY = new PerspectiveCamera( fov, aspect, near, far );
33
	cameraPY.up.set( 0, 0, 1 );
R
Rich Harris 已提交
34
	cameraPY.lookAt( new Vector3( 0, 1, 0 ) );
35
	this.add( cameraPY );
36

R
Rich Harris 已提交
37
	var cameraNY = new PerspectiveCamera( fov, aspect, near, far );
38
	cameraNY.up.set( 0, 0, - 1 );
R
Rich Harris 已提交
39
	cameraNY.lookAt( new Vector3( 0, - 1, 0 ) );
40
	this.add( cameraNY );
41

R
Rich Harris 已提交
42
	var cameraPZ = new PerspectiveCamera( fov, aspect, near, far );
43
	cameraPZ.up.set( 0, - 1, 0 );
R
Rich Harris 已提交
44
	cameraPZ.lookAt( new Vector3( 0, 0, 1 ) );
45
	this.add( cameraPZ );
46

R
Rich Harris 已提交
47
	var cameraNZ = new PerspectiveCamera( fov, aspect, near, far );
48
	cameraNZ.up.set( 0, - 1, 0 );
R
Rich Harris 已提交
49
	cameraNZ.lookAt( new Vector3( 0, 0, - 1 ) );
50
	this.add( cameraNZ );
51

W
WestLangley 已提交
52
	options = options || { format: RGBFormat, magFilter: LinearFilter, minFilter: LinearFilter };
M
Mr.doob 已提交
53

R
Rich Harris 已提交
54
	this.renderTarget = new WebGLRenderTargetCube( cubeResolution, cubeResolution, options );
M
Mr.doob 已提交
55
	this.renderTarget.texture.name = "CubeCamera";
56

W
WestLangley 已提交
57
	this.update = function ( renderer, scene ) {
58

59
		if ( this.parent === null ) this.updateMatrixWorld();
60

61
		var currentRenderTarget = renderer.getRenderTarget();
62

63
		var renderTarget = this.renderTarget;
64
		var generateMipmaps = renderTarget.texture.generateMipmaps;
65

66
		renderTarget.texture.generateMipmaps = false;
67

68
		renderer.setRenderTarget( renderTarget, 0 );
69
		renderer.render( scene, cameraPX );
70

71
		renderer.setRenderTarget( renderTarget, 1 );
72
		renderer.render( scene, cameraNX );
73

74
		renderer.setRenderTarget( renderTarget, 2 );
75
		renderer.render( scene, cameraPY );
76

77
		renderer.setRenderTarget( renderTarget, 3 );
78
		renderer.render( scene, cameraNY );
79

80
		renderer.setRenderTarget( renderTarget, 4 );
81
		renderer.render( scene, cameraPZ );
82

83
		renderTarget.texture.generateMipmaps = generateMipmaps;
84

85
		renderer.setRenderTarget( renderTarget, 5 );
86
		renderer.render( scene, cameraNZ );
87

88
		renderer.setRenderTarget( currentRenderTarget );
89

90 91
	};

92
	this.clear = function ( renderer, color, depth, stencil ) {
W
WestLangley 已提交
93

94 95
		var currentRenderTarget = renderer.getRenderTarget();

W
WestLangley 已提交
96 97 98 99 100 101 102
		var renderTarget = this.renderTarget;

		for ( var i = 0; i < 6; i ++ ) {

			renderTarget.activeCubeFace = i;
			renderer.setRenderTarget( renderTarget );

W
WestLangley 已提交
103
			renderer.clear( color, depth, stencil );
W
WestLangley 已提交
104 105 106

		}

107
		renderer.setRenderTarget( currentRenderTarget );
W
WestLangley 已提交
108

M
Mugen87 已提交
109
	};
W
WestLangley 已提交
110

M
Mr.doob 已提交
111
}
112

R
Rich Harris 已提交
113 114 115 116
CubeCamera.prototype = Object.create( Object3D.prototype );
CubeCamera.prototype.constructor = CubeCamera;


117
export { CubeCamera };