You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
113 lines
3.8 KiB
113 lines
3.8 KiB
import * as THREE from 'three';
|
|
import { TextureLoader } from 'three/src/loaders/TextureLoader.js';
|
|
import { WebGLRenderer } from 'three/src/renderers/WebGLRenderer.js';
|
|
import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls.js';
|
|
|
|
|
|
var container = document.getElementById('container');
|
|
|
|
//创建场景
|
|
var scene = new THREE.Scene();
|
|
|
|
var hemiLight = new THREE.HemisphereLight(0xddeeff, 0x0f0e0d, 2.8);
|
|
scene.add(hemiLight);
|
|
|
|
var bulbLight = new THREE.PointLight(0xffee88, 10.8, 10, 2.9);
|
|
bulbLight.position.set(0.0, 1.3, 0.0);
|
|
scene.add(bulbLight);
|
|
|
|
var textureLoader = new TextureLoader();
|
|
|
|
//创建地板
|
|
var diffuseTexture = textureLoader.load("hardwood2_diffuse.jpg");
|
|
diffuseTexture.wrapS = THREE.RepeatWrapping;
|
|
diffuseTexture.wrapT = THREE.RepeatWrapping;
|
|
diffuseTexture.anisotropy = 4;
|
|
diffuseTexture.repeat.set(10, 24);
|
|
diffuseTexture.encoding = THREE.sRGBEncoding;
|
|
|
|
var bumpTexture = textureLoader.load("hardwood2_bump.jpg");
|
|
bumpTexture.wrapS = THREE.RepeatWrapping;
|
|
bumpTexture.wrapT = THREE.RepeatWrapping;
|
|
bumpTexture.anisotropy = 4;
|
|
bumpTexture.repeat.set(10, 24);
|
|
bumpTexture.encoding = THREE.sRGBEncoding;
|
|
|
|
var roughnessTexture = textureLoader.load("hardwood2_roughness.jpg");
|
|
roughnessTexture.wrapS = THREE.RepeatWrapping;
|
|
roughnessTexture.wrapT = THREE.RepeatWrapping;
|
|
roughnessTexture.anisotropy = 4;
|
|
roughnessTexture.repeat.set(10, 24);
|
|
roughnessTexture.encoding = THREE.sRGBEncoding;
|
|
|
|
var floorMat = new THREE.MeshStandardMaterial({
|
|
roughness: 0.8,
|
|
color: 0xffffff,
|
|
metalness: 0.12,
|
|
bumpScale: 0.005,
|
|
side: THREE.DoubleSide,
|
|
map: diffuseTexture,
|
|
bumpMap: bumpTexture,
|
|
roughnessMap:roughnessTexture
|
|
});
|
|
|
|
floorMat.needsUpdate = true;
|
|
|
|
var floorGeometry = new THREE.PlaneBufferGeometry(20, 20);
|
|
var floorMesh = new THREE.Mesh(floorGeometry, floorMat);
|
|
floorMesh.receiveShadow = true;
|
|
floorMesh.rotation.x = - Math.PI / 2.0;
|
|
scene.add(floorMesh);
|
|
|
|
|
|
//创建墙
|
|
var matArrayB = [];//外墙
|
|
matArrayB.push(new THREE.MeshPhongMaterial({color: 0xafc0ca})); //前 0xafc0ca :灰色
|
|
matArrayB.push(new THREE.MeshPhongMaterial({color: 0x9cb2d1})); //后 0x9cb2d1:淡紫
|
|
matArrayB.push(new THREE.MeshPhongMaterial({color: 0xd6e4ec})); //上 0xd6e4ec: 偏白色
|
|
matArrayB.push(new THREE.MeshPhongMaterial({color: 0xd6e4ec})); //下
|
|
matArrayB.push(new THREE.MeshPhongMaterial({color: 0xafc0ca})); //左 0xafc0ca :灰色
|
|
matArrayB.push(new THREE.MeshPhongMaterial({color: 0xafc0ca})); //右
|
|
|
|
function createCubeWall(width, height, depth,angle,material,x,y,z){
|
|
var cubeGeometry = new THREE.BoxGeometry(width, height, depth );
|
|
var cube = new THREE.Mesh( cubeGeometry, material );
|
|
cube.position.x = x;
|
|
cube.position.y = height / 2;
|
|
cube.position.z = z;
|
|
cube.rotation.y += angle*Math.PI; //-逆时针旋转,+顺时针
|
|
scene.add(cube);
|
|
}
|
|
createCubeWall(0.05, 1.6, 4.5,0,matArrayB,2,0,0.225);
|
|
createCubeWall(0.05, 1.6, 4,0.5,matArrayB,0,0,-2);
|
|
|
|
|
|
//添加辅助坐标
|
|
var axesHelper = new THREE.AxesHelper( 15 );
|
|
scene.add( axesHelper );
|
|
|
|
//创建相机
|
|
var camera = new THREE.PerspectiveCamera(50, window.innerWidth / window.innerHeight, 0.1, 100);
|
|
camera.position.x = -4;
|
|
camera.position.z = 3;
|
|
camera.position.y = 1;
|
|
|
|
//创建渲染器
|
|
var renderer = new WebGLRenderer();
|
|
renderer.physicallyCorrectLights = true;
|
|
renderer.outputEncoding = THREE.sRGBEncoding;
|
|
renderer.shadowMap.enabled = true;
|
|
renderer.toneMapping = THREE.ReinhardToneMapping;
|
|
renderer.setPixelRatio(window.devicePixelRatio);
|
|
renderer.setSize(window.innerWidth, window.innerHeight);
|
|
renderer.setClearColor("rgb(30, 30, 30)", 1); //设置背景颜色
|
|
container.appendChild(renderer.domElement);
|
|
|
|
const controls = new OrbitControls(camera, renderer.domElement);
|
|
|
|
// 渲染函数
|
|
function render() {
|
|
renderer.render(scene, camera); //执行渲染操作
|
|
requestAnimationFrame(render);
|
|
}
|
|
render();
|