案例
描述
- 通过改变标签可以自定义创建一个橘黄色,带有轻微自发光的效果的物体
结果
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/4129e84ec70c23d696ea38cd23c1ad0b.png)
完整代码
var scene;
function initScene() {
scene = new THREE.Scene();
}
var camera;
function initCamera() {
camera = new THREE.PerspectiveCamera(45,window.innerWidth / window.innerHeight,0.1,1000);
camera.position.set(-20,50,40);
camera.lookAt(new THREE.Vector3(10,0,0));
scene.add(camera);
}
var webGLRenderer,canvasRenderer,renderer;
function initRenderer() {
webGLRenderer = new THREE.WebGLRenderer();
webGLRenderer.setClearColor(new THREE.Color(0x000000));
webGLRenderer.setSize(window.innerWidth,window.innerHeight);
webGLRenderer.shadowMap.enabled = true;
canvasRenderer = new THREE.CanvasRenderer();
canvasRenderer.setSize(window.innerWidth,window.innerHeight);
renderer = webGLRenderer;
document.getElementById("webgl-output").appendChild(renderer.domElement);
}
var stats;
function initStats(){
stats = new Stats();
document.getElementById("webgl-output").appendChild(stats.domElement);
}
function initLight(){
var ambientLight = new THREE.AmbientLight(0x0c0c0c);
scene.add(ambientLight);
var spotLight = new THREE.SpotLight("#ffffff");
spotLight.position.set(-40,60,-10);
spotLight.castShadow = true;
spotLight.shadow.mapSize = new THREE.Vector2(1024,1024);
spotLight.shadow.camera.far = 130;
spotLight.shadow.camera.near = 40;
scene.add(spotLight);
}
var axes,cube,plane,meshMaterial,sphere,ground,selectedMesh;
function initModels(){
axes = new THREE.AxesHelper(50);
scene.add(axes);
meshMaterial = new THREE.MeshLambertMaterial({
color:0x7777ff,
})
var groundGeometry = new THREE.PlaneGeometry(100,100,4,4);
var groundMaterial = new THREE.MeshBasicMaterial({
color:0x777777,
})
ground = new THREE.Mesh(groundGeometry,groundMaterial);
ground.rotation.x = -Math.PI / 2;
ground.position.y = -20;
ground.receiveShadow = true;
scene.add(ground);
var cubeGeometry = new THREE.CubeGeometry(15,15,15);
cube = new THREE.Mesh(cubeGeometry,meshMaterial);
cube.position.set(0,3,2);
cube.castShadow = true;
scene.add(cube);
var sphereGeometry = new THREE.SphereGeometry(14,20,20);
sphere = new THREE.Mesh(sphereGeometry,meshMaterial);
sphere.position.set(0,3,2);
sphere.castShadow = true;
var planeGeometry = new THREE.PlaneGeometry(14,14,4,4);
plane = new THREE.Mesh(planeGeometry,meshMaterial);
plane.position = sphere.position;
selectedMesh = cube;
}
var controls;
function initControls() {
controls = new THREE.OrbitControls( camera, renderer.domElement );
controls.enableZoom = true;
controls.autoRotate = true;
controls.enablePan = true;
}
function render() {
renderer.render(scene,camera);
}
function animate(){
stats.update();
selectedMesh.rotation.y += 0.02;
render();
requestAnimationFrame(animate);
}
function windowOnresize(){
camera.aspect = window.innerWidth / window.innerHeight;
camera.updateProjectionMatrix();
renderer.setSize(window.innerWidth,window.innerHeight);
}
var MLM,gui;
function initMBM(){
MLM = cube.material;
MLM = new function(){
this.selectedMesh = "cube";
this.color = meshMaterial.color.getStyle();
this.emissive = meshMaterial.emissive.getHex();
this.wireframe = false;
this.wireframeLinewidth = 1;
};
gui = new dat.GUI();
addBasicMaterialSettings(gui,MLM,meshMaterial);
var MLMGUI = gui.addFolder("THREE.MeshLambertMaterial")
MLMGUI.addColor(MLM,'color').onChange(function(e){
meshMaterial.color.setStyle(e);
});
MLMGUI.addColor(MLM, 'emissive').onChange(function (e) {
meshMaterial.emissive = new THREE.Color(e);
});
MLMGUI.add(MLM,'wireframe').onChange(function (e) {
meshMaterial.wireframe = e;
});
MLMGUI.add(MLM,'wireframeLinewidth',0,20).onChange(function (e) {
meshMaterial.wireframeLinewidth = e;
});
loadGopher(meshMaterial).then(function(gopher){
gopher.scale.set(4,4,4);
gui.add(MLM,'selectedMesh',['cube','sphere','plane','gopher']).onChange(function (e){
scene.remove(cube);
scene.remove(sphere);
scene.remove(plane);
scene.remove(gopher);
switch (e){
case 'cube':
scene.add(cube);
selectedMesh = cube;
break;
case 'sphere':
scene.add(sphere);
selectedMesh = sphere;
break;
case 'plane':
scene.add(plane);
selectedMesh = plane;
break;
case 'gopher':
scene.add(gopher);
selectedMesh = gopher;
break;
}
});
});
}
function draw(){
initScene();
initCamera();
initRenderer();
initStats();
initLight();
initModels();
initControls();
initMBM();
animate();
window.onresize = windowOnresize;
}