05-09 03:24
Notice
Recent Posts
Recent Comments
관리 메뉴

Scientific Computing & Data Science

[WebGL] Refraction 본문

Programming/WebGL(ThreeJS)

[WebGL] Refraction

cinema4dr12 2015. 8. 6. 20:45

이번 예제는 Refraction Material에 관한 것이다. Refraction Material은 유리와 같은 투명 재질을 표현하기 위한 것입니다.

Download Project

03-03-refraction.zip


Click here to view with full screen mode


Operations

Mouse Left Button Click & Drag: Camera Rotating

Mouse Wheel: Camera Zoom In & Out

Mouse Right Button Click & Drag: Camera Panning

main.js

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
// MAIN
 
// standard global variables
var container, scene, camera, renderer, controls, stats;
var keyboard = new THREEx.KeyboardState();
var clock = new THREE.Clock();
 
// custom global variables
var refractSphere, refractSphereCamera; // for refract material
var refractCube, refractCubeCamera; // for refract material
var rotY, step;
 
init();
animate();
 
// FUNCTIONS         
function init() 
{
    // SCENE
    scene = new THREE.Scene();
 
    // CAMERA
    var SCREEN_WIDTH = window.innerWidth, SCREEN_HEIGHT = window.innerHeight;
    var VIEW_ANGLE = 45, ASPECT = SCREEN_WIDTH / SCREEN_HEIGHT, NEAR = 0.1, FAR = 20000;
    camera = new THREE.PerspectiveCamera( VIEW_ANGLE, ASPECT, NEAR, FAR);
    scene.add(camera);
    camera.position.set(0,150,400);
    camera.lookAt(scene.position);
 
    // RENDERER
    if ( Detector.webgl )
        renderer = new THREE.WebGLRenderer( {antialias:true} );
    else
        renderer = new THREE.CanvasRenderer(); 
    renderer.setSize(SCREEN_WIDTH, SCREEN_HEIGHT);
    container = document.getElementById'ThreeJS' );
    container.appendChild( renderer.domElement );
 
    // EVENTS
    THREEx.WindowResize(renderer, camera);
    THREEx.FullScreen.bindKey({ charCode : 'f'.charCodeAt(0) });
 
    // CONTROLS
    controls = new THREE.OrbitControls( camera, renderer.domElement );
 
    // STATS
    stats = new Stats();
    stats.domElement.style.position = 'absolute';
    stats.domElement.style.bottom = '0px';
    stats.domElement.style.zIndex = 100;
    container.appendChild( stats.domElement );
 
    // LIGHT
    var light = new THREE.PointLight(0xffffff);
    light.position.set(0,250,0);
    scene.add(light);
 
    // spotlight #1 -- yellow, dark shadow
    var spotlight = new THREE.SpotLight(0xffc051);
    spotlight.position.set(-60,500,-30);
    spotlight.shadowCameraVisible = true;
    spotlight.shadowDarkness = 0.95;
    spotlight.intensity = 2;
    spotlight.castShadow = true// enable shadow casting ability for the light
    scene.add(spotlight);
 
    // FLOOR
    var floorTexture = new THREE.ImageUtils.loadTexture( 'img/Wood_floor.jpg' );
    floorTexture.wrapS = floorTexture.wrapT = THREE.RepeatWrapping; 
    floorTexture.repeat.set( 11 );
    var floorMaterial = new THREE.MeshBasicMaterial( { map: floorTexture, side:THREE.DoubleSide } );
    var floorGeometry = new THREE.PlaneGeometry(100010001010);
    var floor = new THREE.Mesh(floorGeometry, floorMaterial);
    floor.position.y = -40.5;
    floor.rotation.x = Math.PI / 2;
    floor.receiveShadow = true;
    scene.add(floor);
    
    // SKYBOX
    var imagePrefix = "img/park-";
    var directions  = ["posx""negx""posy""negy""posz""negz"];
    var imageSuffix = ".jpg";
    var skyGeometry = new THREE.CubeGeometry( 500050005000 );    
    
    var materialArray = [];
    for (var i = 0; i < 6; i++)
        materialArray.push( new THREE.MeshBasicMaterial({
            map: THREE.ImageUtils.loadTexture( imagePrefix + directions[i] + imageSuffix ),
            side: THREE.BackSide
        }));
    var skyMaterial = new THREE.MeshFaceMaterial( materialArray );
    var skyBox = new THREE.Mesh( skyGeometry, skyMaterial );
    scene.add( skyBox );
    
    ////////////
    // CUSTOM //
    ////////////
    renderer.shadowMapEnabled = true;
 
    // ADD A SPHERE MESH
    var sphereGeom =  new THREE.SphereGeometry( 806432 );
    refractSphereCamera = new THREE.CubeCamera( 0.15000512 );
    scene.add( refractSphereCamera );
    
    refractSphereCamera.renderTarget.mapping = new THREE.CubeRefractionMapping();
    
    var sphereRefractMaterial = new THREE.MeshBasicMaterial( { 
        color: 0xccccff
        envMap: refractSphereCamera.renderTarget, 
        refractionRatio: 0.985
        reflectivity: 0.9 
        } );        
 
    refractSphere = new THREE.Mesh( sphereGeom, sphereRefractMaterial );
    refractSphere.position.set(-100,50,0);
    refractSphereCamera.position = refractSphere.position;
    refractSphere.castShadow = true;
    scene.add(refractSphere);
 
    // ADD A CUBE MESH
    var cubeGeom = new THREE.CubeGeometry( 120120120 );
    refractCubeCamera = new THREE.CubeCamera( 0.15000512 );
    scene.add( refractCubeCamera );
 
    refractCubeCamera.renderTarget.mapping = new THREE.CubeRefractionMapping();
    
    var cubeRefractMaterial = new THREE.MeshBasicMaterial( { 
        color: 0xff879b
        envMap: refractCubeCamera.renderTarget, 
        refractionRatio: 0.985
        reflectivity: 0.9 
        } );        
 
    refractCube = new THREE.Mesh( cubeGeom, cubeRefractMaterial );
    rotY = 0;
    step = 0.005;
    refractCube.position.set(100,50,0);
    refractCube.rotation.y = rotY;
    refractCubeCamera.position = refractCube.position;
    refractCube.castShadow = true;
    scene.add(refractCube);
}
 
function animate() 
{
    requestAnimationFrame( animate );
    render();        
    update();
}
 
function update()
{
    rotY += step;
    refractCube.rotation.y = rotY;
 
    controls.update();
    stats.update();
}
 
function render() 
{
    // move the CubeCamera to the position of the object
    //    that has a reflective surface, "take a picture" in each direction
    //    and apply it to the surface.
    // need to hide surface before and after so that it does not
    //    "get in the way" of the camera
 
    refractSphere.visible = false;
    refractSphereCamera.updateCubeMap( renderer, scene );
    refractSphere.visible = true;
 
    refractCube.visible = false;
    refractCubeCamera.updateCubeMap( renderer, scene );
    refractCube.visible = true;
    
    renderer.render( scene, camera );
}
cs


'Programming > WebGL(ThreeJS)' 카테고리의 다른 글

[WebGL] Texture Basic  (0) 2015.08.06
[WebGL] Shadow Basic  (0) 2015.08.06
[WebGL] Cube Map  (0) 2015.08.06
[WebGL] Material Basic  (0) 2015.08.06
[WebGL] Geometry Basic  (0) 2015.08.06
Comments