threeJS 创建反光效果

参看博客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>
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Kinghiee

爸爸们求打赏

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值