当前位置: 首页 > news >正文

ThreeJS-投影、投影模糊(十七)

无投影:

完整的代码:

<template>
  <div id="three_div"></div>
</template>
  
  <script>
import * as THREE from "three";
import { OrbitControls } from "three/examples/jsm/controls/OrbitControls";
import {RGBELoader} from "three/examples/jsm/loaders/RGBELoader"
export default {
  name: "HOME",
  components: {
    // vueQr,
    // glHome,
  },
  data() {
    return {};
  },
  mounted() {
    //使用控制器控制3D拖动旋转OrbitControls
    //控制3D物体移动

    //1.创建场景
    const scene = new THREE.Scene();
    console.log(scene);

    //2.创建相机
    const camera = new THREE.PerspectiveCamera(
      75,
      window.innerWidth / window.innerHeight,
      0.1,
      1000
    );
    //设置相机位置
    camera.position.set(0, 0, 10);
    //将相机添加到场景
    scene.add(camera);
    //添加物体
    //创建一个半径为1,经纬度分段数位20的球
    const cubeGeometry = new THREE.SphereBufferGeometry(2,100,100);
    //纹理加载器加载图片
    const cubeMaterial = new THREE.MeshStandardMaterial({
        //side: THREE.DoubleSide,
    });
    //根据几何体和材质创建物体
    const mesh = new THREE.Mesh(cubeGeometry, cubeMaterial);
    //将物体加入到场景
    scene.add(mesh);
    
    //创建平面几何体
    const planeGeometry = new THREE.PlaneBufferGeometry(10, 10);
    //创建平面物体
    const planeMesh = new THREE.Mesh(planeGeometry, cubeMaterial);
    planeMesh.position.set(0, -2, 0);
    planeMesh.rotation.x = -Math.PI/2;
     //场景添加平面物体
     scene.add(planeMesh);
    
    //给场景所有的物体添加默认的环境贴图
    //添加坐标轴辅助器
    const axesHepler = new THREE.AxesHelper(5);
    scene.add(axesHepler);
    //标准材质需要借助灯光

    //添加周围环境灯光(由物体发出的灯光)参数(灯色,强度0-1)
    const light = new THREE.AmbientLight(0xFFFFFF, 0.7);
    scene.add(light);
    //直线光(由光源发出的灯光)
    const directionalLight = new THREE.DirectionalLight(0xFFFFFF, 0.7);
    directionalLight.position.set(10, 10, 10);
    scene.add(directionalLight);

    //添加平面
    // const planeGeometry = new THREE.PlaneBufferGeometry(1, 1);
    // const mesh2 = new THREE.Mesh(planeGeometry, cubeMaterial);
    // mesh2.position.set(0, 0, 3);

    // scene.add(mesh2);
    //初始化渲染器
    const render = new THREE.WebGLRenderer();
    //设置渲染器的尺寸
    render.setSize(window.innerWidth, window.innerHeight);
    //使用渲染器,通过相机将场景渲染进来

    //创建轨道控制器,可以拖动,控制的是摄像头
    const controls = new OrbitControls(camera, render.domElement);
    //设置控制阻尼,让控制器有更真实的效果
    controls.enableDamping = true;


    // //开启投影
    // //开启渲染器投影
    // render.shadowMap.enabled = true;
    // //开启灯光动态投影
    // directionalLight.castShadow = true;
    // //开启物体投影
    // mesh.castShadow = true;
    // //开启平面接受投影
    // planeMesh.receiveShadow = true;


    //将webgl渲染的canvas内容添加到body上
    document.getElementById("three_div").appendChild(render.domElement);

    //渲染下一帧的时候就会调用回调函数
    let renderFun = () => {
      //更新阻尼数据
      controls.update();
      //需要重新绘制canvas画布
      render.render(scene, camera);
      //监听屏幕刷新(60HZ,120HZ),每次刷新触发一次requestAnimationFrame回调函数
      //但是requestAnimationFrame的回调函数注册生命只有一次,因此需要循环注册,才能达到一直调用的效果
      window.requestAnimationFrame(renderFun);
    };
    // window.requestAnimationFrame(renderFun);
    renderFun();

    //画布全屏
    window.addEventListener("dblclick", () => {
      if (document.fullscreenElement) {
        document.exitFullscreen();
      } else {
        //document.documentElement.requestFullscreen();
        render.domElement.requestFullscreen();
      }
    });

    //监听画面变化,更新渲染画面,(自适应的大小)
    window.addEventListener("resize", () => {
      //更新摄像机的宽高比
      camera.aspect = window.innerWidth / window.innerHeight;
      //更新摄像机的投影矩阵
      camera.updateProjectionMatrix();
      //更新渲染器宽度和高度
      render.setSize(window.innerWidth, window.innerHeight);
      //设置渲染器的像素比
      render.setPixelRatio(window.devicePixelRatio);
      console.log("画面变化了");
    });
  },
  methods: {
    paush(animate) {
      animate.pause();
    },
  },
};
</script>
  
<style scoped lang="scss">
</style>
  

效果图:

 添加投影

关键代码:

    //开启投影
    //开启渲染器投影
    render.shadowMap.enabled = true;
    //开启灯光动态投影
    directionalLight.castShadow = true;
    //开启物体投影
    mesh.castShadow = true;
    //开启平面接受投影
    planeMesh.receiveShadow = true;

完整代码:

<template>
  <div id="three_div"></div>
</template>
  
  <script>
import * as THREE from "three";
import { OrbitControls } from "three/examples/jsm/controls/OrbitControls";
import {RGBELoader} from "three/examples/jsm/loaders/RGBELoader"
export default {
  name: "HOME",
  components: {
    // vueQr,
    // glHome,
  },
  data() {
    return {};
  },
  mounted() {
    //使用控制器控制3D拖动旋转OrbitControls
    //控制3D物体移动

    //1.创建场景
    const scene = new THREE.Scene();
    console.log(scene);

    //2.创建相机
    const camera = new THREE.PerspectiveCamera(
      75,
      window.innerWidth / window.innerHeight,
      0.1,
      1000
    );
    //设置相机位置
    camera.position.set(0, 0, 10);
    //将相机添加到场景
    scene.add(camera);
    //添加物体
    //创建一个半径为1,经纬度分段数位20的球
    const cubeGeometry = new THREE.SphereBufferGeometry(2,100,100);
    //纹理加载器加载图片
    const cubeMaterial = new THREE.MeshStandardMaterial({
        //side: THREE.DoubleSide,
    });
    //根据几何体和材质创建物体
    const mesh = new THREE.Mesh(cubeGeometry, cubeMaterial);
    //将物体加入到场景
    scene.add(mesh);
    
    //创建平面几何体
    const planeGeometry = new THREE.PlaneBufferGeometry(10, 10);
    //创建平面物体
    const planeMesh = new THREE.Mesh(planeGeometry, cubeMaterial);
    planeMesh.position.set(0, -2, 0);
    planeMesh.rotation.x = -Math.PI/2;
     //场景添加平面物体
     scene.add(planeMesh);
    
    //给场景所有的物体添加默认的环境贴图
    //添加坐标轴辅助器
    const axesHepler = new THREE.AxesHelper(5);
    scene.add(axesHepler);
    //标准材质需要借助灯光

    //添加周围环境灯光(由物体发出的灯光)参数(灯色,强度0-1)
    const light = new THREE.AmbientLight(0xFFFFFF, 0.7);
    scene.add(light);
    //直线光(由光源发出的灯光)
    const directionalLight = new THREE.DirectionalLight(0xFFFFFF, 0.7);
    directionalLight.position.set(10, 10, 10);
    scene.add(directionalLight);

    //添加平面
    // const planeGeometry = new THREE.PlaneBufferGeometry(1, 1);
    // const mesh2 = new THREE.Mesh(planeGeometry, cubeMaterial);
    // mesh2.position.set(0, 0, 3);

    // scene.add(mesh2);
    //初始化渲染器
    const render = new THREE.WebGLRenderer();
    //设置渲染器的尺寸
    render.setSize(window.innerWidth, window.innerHeight);
    //使用渲染器,通过相机将场景渲染进来

    //创建轨道控制器,可以拖动,控制的是摄像头
    const controls = new OrbitControls(camera, render.domElement);
    //设置控制阻尼,让控制器有更真实的效果
    controls.enableDamping = true;


    //开启投影
    //开启渲染器投影
    render.shadowMap.enabled = true;
    //开启灯光动态投影
    directionalLight.castShadow = true;
    //开启物体投影
    mesh.castShadow = true;
    //开启平面接受投影
    planeMesh.receiveShadow = true;


    //将webgl渲染的canvas内容添加到body上
    document.getElementById("three_div").appendChild(render.domElement);

    //渲染下一帧的时候就会调用回调函数
    let renderFun = () => {
      //更新阻尼数据
      controls.update();
      //需要重新绘制canvas画布
      render.render(scene, camera);
      //监听屏幕刷新(60HZ,120HZ),每次刷新触发一次requestAnimationFrame回调函数
      //但是requestAnimationFrame的回调函数注册生命只有一次,因此需要循环注册,才能达到一直调用的效果
      window.requestAnimationFrame(renderFun);
    };
    // window.requestAnimationFrame(renderFun);
    renderFun();

    //画布全屏
    window.addEventListener("dblclick", () => {
      if (document.fullscreenElement) {
        document.exitFullscreen();
      } else {
        //document.documentElement.requestFullscreen();
        render.domElement.requestFullscreen();
      }
    });

    //监听画面变化,更新渲染画面,(自适应的大小)
    window.addEventListener("resize", () => {
      //更新摄像机的宽高比
      camera.aspect = window.innerWidth / window.innerHeight;
      //更新摄像机的投影矩阵
      camera.updateProjectionMatrix();
      //更新渲染器宽度和高度
      render.setSize(window.innerWidth, window.innerHeight);
      //设置渲染器的像素比
      render.setPixelRatio(window.devicePixelRatio);
      console.log("画面变化了");
    });
  },
  methods: {
    paush(animate) {
      animate.pause();
    },
  },
};
</script>
  
<style scoped lang="scss">
</style>
  

效果图:

投影模糊度

关键代码:

            //投影模糊度
            directionalLight.shadow.radius = 20;
            //设置投影的宽度和高度
            directionalLight.shadow.mapSize.set(2048, 2048); 

 完整代码:

<template>
    <div id="three_div"></div>
</template>

<script>
    import * as THREE from "three";
    import {
        OrbitControls
    } from "three/examples/jsm/controls/OrbitControls";
    import {
        RGBELoader
    } from "three/examples/jsm/loaders/RGBELoader"
    export default {
        name: "HOME",
        components: {
            // vueQr,
            // glHome,
        },
        data() {
            return {};
        },
        mounted() {
            //使用控制器控制3D拖动旋转OrbitControls
            //控制3D物体移动

            //1.创建场景
            const scene = new THREE.Scene();
            console.log(scene);

            //2.创建相机
            const camera = new THREE.PerspectiveCamera(
                75,
                window.innerWidth / window.innerHeight,
                0.1,
                1000
            );
            //设置相机位置
            camera.position.set(0, 0, 10);
            //将相机添加到场景
            scene.add(camera);
            //添加物体
            //创建一个半径为1,经纬度分段数位20的球
            const cubeGeometry = new THREE.SphereBufferGeometry(2, 100, 100);
            //纹理加载器加载图片
            const cubeMaterial = new THREE.MeshStandardMaterial({
                //side: THREE.DoubleSide,
            });
            //根据几何体和材质创建物体
            const mesh = new THREE.Mesh(cubeGeometry, cubeMaterial);
            //将物体加入到场景
            scene.add(mesh);

            //创建平面几何体
            const planeGeometry = new THREE.PlaneBufferGeometry(20, 20);
            //创建平面物体
            const planeMesh = new THREE.Mesh(planeGeometry, cubeMaterial);
            planeMesh.position.set(0, -2, 0);
            planeMesh.rotation.x = -Math.PI / 2;
            //场景添加平面物体
            scene.add(planeMesh);

            //给场景所有的物体添加默认的环境贴图
            //添加坐标轴辅助器
            const axesHepler = new THREE.AxesHelper(5);
            scene.add(axesHepler);
            //标准材质需要借助灯光

            //添加周围环境灯光(由物体发出的灯光)参数(灯色,强度0-1)
            const light = new THREE.AmbientLight(0xFFFFFF, 0.7);
            scene.add(light);
            //直线光(由光源发出的灯光)
            const directionalLight = new THREE.DirectionalLight(0xFFFFFF, 0.7);
            directionalLight.position.set(10, 10, 10);
            scene.add(directionalLight);

            //添加平面
            // const planeGeometry = new THREE.PlaneBufferGeometry(1, 1);
            // const mesh2 = new THREE.Mesh(planeGeometry, cubeMaterial);
            // mesh2.position.set(0, 0, 3);

            // scene.add(mesh2);
            //初始化渲染器
            const render = new THREE.WebGLRenderer();
            //设置渲染器的尺寸
            render.setSize(window.innerWidth, window.innerHeight);
            //使用渲染器,通过相机将场景渲染进来

            //创建轨道控制器,可以拖动,控制的是摄像头
            const controls = new OrbitControls(camera, render.domElement);
            //设置控制阻尼,让控制器有更真实的效果
            controls.enableDamping = true;


            //开启投影
            //开启渲染器投影
            render.shadowMap.enabled = true;
            //开启灯光动态投影
            directionalLight.castShadow = true;
            //开启物体投影
            mesh.castShadow = true;
            //开启平面接受投影
            planeMesh.receiveShadow = true;
            //投影模糊度
            directionalLight.shadow.radius = 20;
            //设置投影的宽度和高度
            directionalLight.shadow.mapSize.set(1024, 1024);

            //将webgl渲染的canvas内容添加到body上
            document.getElementById("three_div").appendChild(render.domElement);

            //渲染下一帧的时候就会调用回调函数
            let renderFun = () => {
                //更新阻尼数据
                controls.update();
                //需要重新绘制canvas画布
                render.render(scene, camera);
                //监听屏幕刷新(60HZ,120HZ),每次刷新触发一次requestAnimationFrame回调函数
                //但是requestAnimationFrame的回调函数注册生命只有一次,因此需要循环注册,才能达到一直调用的效果
                window.requestAnimationFrame(renderFun);
            };
            // window.requestAnimationFrame(renderFun);
            renderFun();

            //画布全屏
            window.addEventListener("dblclick", () => {
                if (document.fullscreenElement) {
                    document.exitFullscreen();
                } else {
                    //document.documentElement.requestFullscreen();
                    render.domElement.requestFullscreen();
                }
            });

            //监听画面变化,更新渲染画面,(自适应的大小)
            window.addEventListener("resize", () => {
                //更新摄像机的宽高比
                camera.aspect = window.innerWidth / window.innerHeight;
                //更新摄像机的投影矩阵
                camera.updateProjectionMatrix();
                //更新渲染器宽度和高度
                render.setSize(window.innerWidth, window.innerHeight);
                //设置渲染器的像素比
                render.setPixelRatio(window.devicePixelRatio);
                console.log("画面变化了");
            });
        },
        methods: {
            paush(animate) {
                animate.pause();
            },
        },
    };
</script>

<style scoped lang="scss">
</style>

效果图:

 

http://www.lryc.cn/news/56086.html

相关文章:

  • 蓝桥杯赛前冲刺-枚举暴力和排序专题1(包含历年蓝桥杯真题和AC代码)
  • Github库中的Languages显示与修改
  • RocketMQ消息高可靠详解
  • 【python设计模式】4、建造者模式
  • 【全网独家】华为OD机试Golang解题 - 机智的外卖员
  • Sentinel滑动时间窗限流算法原理及源码解析(中)
  • 【OpenLayers】VUE+OpenLayers+ElementUI加载WMS地图服务
  • linux 命名管道 mkfifo
  • Redis(主从复制、哨兵模式、集群)概述及部署
  • windows下软件包安装工具之Scoop安装与使用
  • 九龙证券|人工智能+国产软件+智慧城市概念股火了,欧洲资管巨头大举抄底
  • Nacos下载安装与配置(windows)
  • QT学习笔记(语音识别项目 )
  • Vulnhub:DC-4靶机
  • 序列差分练习题--从模板到灵活运用
  • Xshell 连接 Ubuntu 20.04
  • 【网口交换机:交换机KSZ9897学习-笔记-资料汇总-记录】
  • linux信号量及其实例
  • Nomogram | 盘点一下绘制列线图的几个R包!~(一)
  • 两个数组的交集(力扣刷题)
  • SonarQube 10.0 (macOS, Linux, Windows) - 清洁代码 (Clean Code)
  • 怎么统一把文件名不需要部分批量替换掉
  • Vue3电商项目实战-结算支付 3【05-结算-收货地址-添加、06-结算-收货地址-修改、07-结算-提交订单】
  • 开心档之开发入门网-C++ 变量作用域
  • 蓝易云:linux怎么关闭防火墙详细教程
  • 操作系统-用户进程
  • 小驰私房菜_07_camx EIS使能
  • 互联网快速发展,孕育着新技术、新模式的全新时代正在到来
  • 【VUE】1、安装node.js
  • 一文弄懂window.print()打印