forked from Wangjingyi-917/Soldier.github.io
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.js
158 lines (112 loc) · 3.74 KB
/
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
import * as three from './files/three.js';
import {GLTFLoader} from './files/GLTFLoader.js';
import {OrbitControls} from './files/OrbitControls.js';
let renderer, camera, scene, light, meshes;
let mixer;
let plane, model;
let dirLight;
let clock = new THREE.Clock();
let axesHelper;
let controls;
initRenderer();
initCamera();
initScene();
initLight();
initMeshes();
enableShadow();
initAxesHelper();
initControls();
window.addEventListener('resize', function(){//渲染结果随着窗体的变化而变化(浏览器变窄了,渲染窗口也变窄)
camera.aspect = window.innerWidth/this.window.innerHeight;
camera.updateProjectionMatrix();
renderer.setSize(window.innerWidth, this.window.innerHeight);
})
/* ------------------场景三要素初始化------------------- */
function initRenderer() {
renderer = new THREE.WebGL1Renderer();
renderer.setPixelRatio(window.devicePixelRatio)
renderer.setSize(window.innerWidth, window.innerHeight);
renderer.outputEncoding = THREE.sRGBEncoding;
document.body.appendChild(renderer.domElement);
}
function initCamera(){
camera = new THREE.PerspectiveCamera(40,window.innerWidth/window.innerHeight, 0.1, 1000);
camera.position.set(1, 2, -6);
camera.lookAt(0,1,0);
}
function initScene(){
scene = new THREE.Scene();
scene.background = new THREE.Color(0xa0a0a0);
scene.fog= new THREE.Fog(0xa0a0a0, 10, 50);//场景虚化
}
/* ------------------场景三要素初始化------------------- */
/* ------------------灯光------------------- */
function initLight(){
light = new THREE.HemisphereLight(0xffffff, 0x444444);
light.position.set(0, 1, 0);
scene.add(light);
dirLight = new THREE.DirectionalLight(0xffffff);
dirLight.position.set(-3, 10, 10);
scene.add(dirLight);
}
/* ------------------灯光------------------- */
/* ------------------加载3维模型------------------- */
function initMeshes(){
//plane
plane = new THREE.Mesh(
new THREE.PlaneGeometry(100, 100),
new THREE.MeshPhongMaterial({
color:0x999999
})
);
plane.rotation.x = - Math.PI / 2;
scene.add(plane);
//model
const loader = new GLTFLoader();
loader.load('./assets/Soldier.glb',function(gltf){
scene.add(gltf.scene);
gltf.scene.traverse( function(object){
// console.log(object.type);
if(object.isMesh){
//console.log(object);
object.castShadow = true;
}
})
//让模型动起来
const clip = gltf.animations[3];
mixer = new THREE.AnimationMixer(gltf.scene);
const action = mixer.clipAction(clip);
action.play();
console.log(gltf);
render();
});
}
/* ------------------加载3维模型------------------- */
/* ------------------坐标轴------------------- */
function initAxesHelper(){
axesHelper = new THREE.AxesHelper(1);
scene.add(axesHelper);
}
/* ------------------坐标轴------------------- */
/* ------------------阴影------------------- */
function enableShadow(){
renderer.shadowMap.enabled = true;
dirLight.castShadow = true;
plane.receiveShadow = true;
};
/* ------------------阴影------------------- */
/* ------------------控制器------------------- */
function initControls(){
controls = new OrbitControls(camera, renderer.domElement);
controls.target.set(0, 1, 0);
controls.update();
}
/* ------------------控制器------------------- */
/* ------------------渲染器------------------- */
function render(){
let delta = clock.getDelta();
requestAnimationFrame( render );
renderer.render(scene,camera);
mixer.update(delta);
}
/* ------------------渲染器------------------- */