200字范文,内容丰富有趣,生活中的好帮手!
200字范文 > 96 Three.js 使用cubeCamera相机创建反光效果

96 Three.js 使用cubeCamera相机创建反光效果

时间:2023-09-06 03:52:03

相关推荐

96 Three.js 使用cubeCamera相机创建反光效果

案例查看地址:/blog/threejs/-05-03/159.html

通过案例可以看到,中间的球体不但可以和上一节一样看到环境贴图的相关纹理,连两边的模型都实现了反光的效果。这主要得益于cubeCamera的强大功能。

简介

使用THREE.CubeCamera可以为场景中的所要渲染的物体创建快照,并使用这些快照创建CubeMap对象。但是需要确保摄像机放置在THREE.Mesh你所想显示反射的位置上。

案例实现

首先,创建一个cubeCamera

//CubeCamera(near:Number,far:Number,cubeResolution:Number)//近 - 近裁剪距离。//远 - 裁剪距离//cubeResolution - 设置立方体边缘的长度。//可以通过renderTarget对象获取生成的立方体纹理。//创建一个获取环境贴图的cubeCameracubeCamera = new THREE.CubeCamera(0.1, 1000, 256);scene.add(cubeCamera);

我们创建场景内所需要的内容,给scene添加背景,创建球体和球体旁边的两个模型,并给球体的环境贴图赋值cubeCamera的纹理:

//添加中间显示的球体var geometry = new THREE.SphereBufferGeometry( 2, 100, 50 );//将cubeCamera的立方体纹理赋值给Material的envMapmaterial = new THREE.MeshBasicMaterial({envMap:cubeCamera.renderTarget.texture});var cubeMaterial = new THREE.MeshPhongMaterial({map:new THREE.TextureLoader().load("/lib/textures/disturb.jpg")});//添加球形var sphereMesh = new THREE.Mesh( geometry, material );scene.add( sphereMesh );//添加立方体cubeMesh = new THREE.Mesh(new THREE.CubeGeometry(2, 2, 2), cubeMaterial);cubeMesh.position.set(-5, 0, 0);scene.add(cubeMesh);//添加甜甜圈torusMesh = new THREE.Mesh(new THREE.TorusGeometry(2, 1, 16, 100), cubeMaterial);torusMesh.position.set(8, 0, 0);scene.add(torusMesh);

最后在render回调函数内更新获取纹理:

cubeCamera.update( renderer, scene );

注意,贴图的模型最好和相机的位置相同,这样获取到的贴图的效果最有代入感。

案例代码

<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><title>Threejs使用CubeCamera创建反光效果</title><style type="text/css">html, body {margin: 0;height: 100%;}canvas {display: block;}</style></head><body onload="draw();"></body><script src="/three.js/91/three.min.js"></script><script src="/lib/js/controls/OrbitControls.js"></script><script src="/stats.js/r17/Stats.min.js"></script><script src="/dat-gui/0.7.1/dat.gui.min.js"></script><script src="/lib/js/Detector.js"></script><script>var renderer, camera, scene, gui, light, stats, controls, material, cubeMesh, torusMesh, cubeCamera;function initRender() {renderer = new THREE.WebGLRenderer({antialias: true});renderer.setPixelRatio(window.devicePixelRatio);renderer.setSize(window.innerWidth, window.innerHeight);renderer.setClearColor(0xeeeeee);renderer.shadowMap.enabled = true;//告诉渲染器需要阴影效果document.body.appendChild(renderer.domElement);}function initCamera() {camera = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 0.1, 200);camera.position.set(0, 12, 15 );//CubeCamera(near:Number,far:Number,cubeResolution:Number)//近 - 近裁剪距离。//远 - 裁剪距离//cubeResolution - 设置立方体边缘的长度。//可以通过renderTarget对象获取生成的立方体纹理。//创建一个获取环境贴图的cubeCameracubeCamera = new THREE.CubeCamera(0.1, 1000, 256);scene.add(cubeCamera);}function initScene() {//给场景添加天空盒子纹理var cubeTextureLoader = new THREE.CubeTextureLoader();cubeTextureLoader.setPath( '/lib/textures/cube/skybox/' );//六张图片分别是朝前的(posz)、朝后的(negz)、朝上的(posy)、朝下的(negy)、朝右的(posx)和朝左的(negx)。var cubeTexture = cubeTextureLoader.load( ['px.jpg', 'nx.jpg','py.jpg', 'ny.jpg','pz.jpg', 'nz.jpg'] );scene = new THREE.Scene();scene.background = cubeTexture;}//初始化dat.GUI简化试验流程function initGui() {//声明一个保存需求修改的相关数据的对象gui = {changeBg:function () {scene.background = new THREE.CubeTextureLoader().setPath( '/lib/textures/cube/pisa/' ).load( [ 'px.png', 'nx.png', 'py.png', 'ny.png', 'pz.png', 'nz.png' ] );sphereMaterial.envMap = scene.background;}};//var datGui = new dat.GUI();//将设置属性添加到gui当中,gui.add(对象,属性,最小值,最大值)}function initLight() {scene.add(new THREE.AmbientLight(0x444444));light = new THREE.DirectionalLight(0xffffff);light.position.set(0, 20, 20 );light.castShadow = true;light.shadow.camera.top = 10;light.shadow.camera.bottom = -10;light.shadow.camera.left = -10;light.shadow.camera.right = 10;//告诉平行光需要开启阴影投射light.castShadow = true;scene.add(light);}function initModel() {//辅助工具var helper = new THREE.AxesHelper(50);scene.add(helper);//添加中间显示的球体var geometry = new THREE.SphereBufferGeometry( 2, 100, 50 );//将cubeCamera的立方体纹理赋值给Material的envMapmaterial = new THREE.MeshBasicMaterial({envMap:cubeCamera.renderTarget.texture});var cubeMaterial = new THREE.MeshPhongMaterial({map:new THREE.TextureLoader().load("/lib/textures/disturb.jpg")});//添加球形var sphereMesh = new THREE.Mesh( geometry, material );scene.add( sphereMesh );//添加立方体cubeMesh = new THREE.Mesh(new THREE.CubeGeometry(2, 2, 2), cubeMaterial);cubeMesh.position.set(-5, 0, 0);scene.add(cubeMesh);//添加甜甜圈torusMesh = new THREE.Mesh(new THREE.TorusGeometry(2, 1, 16, 100), cubeMaterial);torusMesh.position.set(8, 0, 0);scene.add(torusMesh);}//初始化性能插件function initStats() {stats = new Stats();document.body.appendChild(stats.dom);}function initControls() {controls = new THREE.OrbitControls(camera, renderer.domElement);//设置控制器的中心点//controls.target.set( 0, 5, 0 );// 如果使用animate方法时,将此函数删除//controls.addEventListener( 'change', render );// 使动画循环使用时阻尼或自转 意思是否有惯性controls.enableDamping = true;//动态阻尼系数 就是鼠标拖拽旋转灵敏度//controls.dampingFactor = 0.25;//是否可以缩放controls.enableZoom = true;//是否自动旋转controls.autoRotate = false;controls.autoRotateSpeed = 0.5;//设置相机距离原点的最远距离controls.minDistance = 1;//设置相机距离原点的最远距离controls.maxDistance = 2000;//是否开启右键拖拽controls.enablePan = true;}function render() {//首先更新cubeCamera的相机cubeCamera.update( renderer, scene );//让旁边的两个模型自动旋转cubeMesh.rotation.x += 0.01;cubeMesh.rotation.y += 0.01;torusMesh.rotation.x += 0.01;torusMesh.rotation.y += 0.01;}//窗口变动触发的函数function onWindowResize() {camera.aspect = window.innerWidth / window.innerHeight;camera.updateProjectionMatrix();renderer.setSize(window.innerWidth, window.innerHeight);}function animate() {//更新控制器render();//更新性能插件stats.update();controls.update();renderer.render(scene, camera);requestAnimationFrame(animate);}function draw() {//兼容性判断if (!Detector.webgl) Detector.addGetWebGLMessage();initGui();initRender();initScene();initCamera();initLight();initModel();initControls();initStats();animate();window.onresize = onWindowResize;}</script></html>

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。