参看博客Three.js 使用cubeCamera相机创建反光效果
效果图
总体步骤
① 创建场景
② 创建相机
③ 创建物体
④ 创建渲染器
html代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0">
<title>Title</title>
<style>
html,body{
padding: 0;
margin: 0;
overflow: hidden;
}
</style>
</head>
<body>
<div id="container">
</div>
<script type="module">
</script>
</body>
</html>
导入文件,创建全局变量和函数
import * as THREE from "./js/three.module.js";
import {OrbitControls} from "./js/OrbitControls.js";
import Stats from './js/stats.module.js';
let renderer,scene,camera,spotLight,status,cubeCamera;
action();
function action() {
onload();
run();
}
function onload(){
}
function run()
{
}
function onResize()
{
}
①创建场景
onload函数中
let container=document.getElementById("container");//获取container
scene=new THREE.Scene();//创建场景
②创建相机
onload函数中
camera=new THREE.PerspectiveCamera(45,window.innerWidth/window.innerHeight,1,10000);
camera.position.set( 30, 30, 100 );
③创建物体
onload函数中
let ambientLight=new THREE.AmbientLight();//添加环境光
scene.add(ambientLight);
let directionalLight=new THREE.DirectionalLight(0xffffff, 0.8);
directionalLight.position.set(0,10,10);
scene.add(directionalLight);
let skyCube=new THREE.CubeTextureLoader().setPath("./img/").load([ 'px.jpg', 'nx.jpg',
'py.jpg', 'ny.jpg',
'pz.jpg', 'nz.jpg']);
scene.background=skyCube;//添加环境贴图
let materialLoader=new THREE.TextureLoader().load("./img/disturb.jpg");//加载贴图
let cubeGeometry=new THREE.BoxBufferGeometry(2,2,2,20);//创建立方体
let material=new THREE.MeshPhongMaterial({map:materialLoader});
let cubeMesh=new THREE.Mesh(cubeGeometry,material);
cubeMesh.position.set(-10,0,0);
scene.add(cubeMesh);
cubeCamera=new THREE.CubeCamera(0.1, 1000, 256);//使用THREE.CubeCamera可以为场景中的所要渲染的物体创建快照,并使用这些快照创建CubeMap对象。但是需要确保摄像机放置在THREE.Mesh你所想显示反射的位置上。
//近 - 近裁剪距离。
//远 - 裁剪距离
//cubeResolution - 设置立方体边缘的长度。
scene.add(cubeCamera);
let geometry = new THREE.SphereBufferGeometry( 2, 100, 50 );
let geoMaterial=new THREE.MeshBasicMaterial({envMap:cubeCamera.renderTarget.texture});
let geoMesh=new THREE.Mesh(geometry,geoMaterial);
scene.add(geoMesh);
let torusMesh=new THREE.Mesh(new THREE.TorusGeometry(2, 1, 16, 100), material);
torusMesh.position.set(10,0,0);
scene.add(torusMesh);
④ 创建渲染器
onload函数中
renderer=new THREE.WebGLRenderer({antialias:true});
renderer.setPixelRatio(window.devicePixelRatio);
//renderer.setClearColor(0xEEEEEE);
//renderer.autoClear = false;
renderer.gammaInput=true;
renderer.gammaOutput=true;//inear转gamma
renderer.setSize(window.innerWidth,window.innerHeight);
container.appendChild(renderer.domElement);
status=new Stats();//创建频率显示
container.appendChild(status.dom);//频率挂到左上角
let contorl=new OrbitControls(camera,renderer.domElement);//添加鼠标滚动缩放,旋转对象
window.addEventListener('resize',onResize,false);//浏览器大小改变监听
onResize函数中
function onResize() {
camera.aspect=window.innerWidth/window.innerHeight;
camera.updateProjectionMatrix();
renderer.setSize(window.innerWidth,window.innerHeight);
}
run函数中
function run() {
requestAnimationFrame(run);
cubeCamera.update(renderer,scene);
renderer.render(scene,camera);
status.update();
}
总代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0">
<title>Title</title>
<style>
html,body{
padding: 0;
margin: 0;
overflow: hidden;
}
</style>
</head>
<body>
<div id="container">
</div>
<script type="module">
import * as THREE from "./js/three.module.js";
import {OrbitControls} from "./js/OrbitControls.js";
//import { GUI } from './js/dat.gui.module.js';
import Stats from './js/stats.module.js';
let renderer,scene,camera,spotLight,status,cubeCamera;
action();
function action() {
onload();
run();
}
function onload() {
let container=document.getElementById("container");//获取container
scene=new THREE.Scene();//创建场景
camera=new THREE.PerspectiveCamera(45,window.innerWidth/window.innerHeight,1,10000);
camera.position.set( 30, 30, 100 );
let ambientLight=new THREE.AmbientLight();//添加环境光
scene.add(ambientLight);
let directionalLight=new THREE.DirectionalLight(0xffffff, 0.8);
directionalLight.position.set(0,10,10);
scene.add(directionalLight);
let skyCube=new THREE.CubeTextureLoader().setPath("./img/").load([ 'px.jpg', 'nx.jpg',
'py.jpg', 'ny.jpg',
'pz.jpg', 'nz.jpg']);
scene.background=skyCube;
let materialLoader=new THREE.TextureLoader().load("./img/disturb.jpg");
let cubeGeometry=new THREE.BoxBufferGeometry(2,2,2,20);
let material=new THREE.MeshPhongMaterial({map:materialLoader});
let cubeMesh=new THREE.Mesh(cubeGeometry,material);
cubeMesh.position.set(-10,0,0);
scene.add(cubeMesh);
cubeCamera=new THREE.CubeCamera(0.1, 1000, 256);
scene.add(cubeCamera);
let geometry = new THREE.SphereBufferGeometry( 2, 100, 50 );
let geoMaterial=new THREE.MeshBasicMaterial({envMap:cubeCamera.renderTarget.texture});
let geoMesh=new THREE.Mesh(geometry,geoMaterial);
scene.add(geoMesh);
let torusMesh=new THREE.Mesh(new THREE.TorusGeometry(2, 1, 16, 100), material);
torusMesh.position.set(10,0,0);
scene.add(torusMesh);
renderer=new THREE.WebGLRenderer({antialias:true});
renderer.setPixelRatio(window.devicePixelRatio);
//renderer.setClearColor(0xEEEEEE);
//renderer.autoClear = false;
renderer.gammaInput=true;
renderer.gammaOutput=true;//inear转gamma
renderer.setSize(window.innerWidth,window.innerHeight);
container.appendChild(renderer.domElement);
status=new Stats();//创建频率显示
container.appendChild(status.dom);//频率挂到左上角
let contorl=new OrbitControls(camera,renderer.domElement);//添加鼠标滚动缩放,旋转对象
window.addEventListener('resize',onResize,false);//浏览器大小改变监听
}
function onResize() {
camera.aspect=window.innerWidth/window.innerHeight;
camera.updateProjectionMatrix();
renderer.setSize(window.innerWidth,window.innerHeight);
}
function run() {
requestAnimationFrame(run);
cubeCamera.update(renderer,scene);
renderer.render(scene,camera);
status.update();
}
</script>
</body>
</html>