XMLHttpRequest以及Promise对象的使用

AJAX原理

通过[XHR]XMLHttpRequest对象来和服务器进行交互,axios库的底层也是通过XMLHttpRequest来和服务器进行交互,只是将实现细节进行了封装,让操作更加简洁

可以用于某些只需和服务器进行少次交互的静态网站进行使用,减少代码的体积

如何使用XMLHttpRequest

  1. 创建对象
  2. 配置请求方法和url地址–对象.open('请求方法','请求url地址')
  3. 监听loadend事件–即为该对象绑定loadend事件,通过回调函数接收响应结果
  4. 通过对象.send()来发起请求

通过获取省份来进行这个对象的使用

/**
     * 目标:使用XMLHttpRequest对象与服务器通信
     *  1. 创建 XMLHttpRequest 对象
     *  2. 配置请求方法和请求 url 地址
     *  3. 监听 loadend 事件,接收响应结果
     *  4. 发起请求
    */
    //创建对象
    const xhr = new XMLHttpRequest();
    //通过open方法配置请求方法和请求url地址
    xhr.open('GET', 'http://hmajax.itheima.net/api/province');
    //为该对象绑定loadend事件
    xhr.addEventListener('loadend', () => {
      //获取响应结果
      console.log(xhr.response);
      //由于返回的结果为json格式的数据,所以需要转换为对象格式的数据
      const data = JSON.parse(xhr.response);
      console.log(data.list.join('<br>'));
      document.querySelector('.province').innerHTML = data.list.join('<br>');
    })
    //发起一次请求
    xhr.send();

XMLHttpRequest如何添加查询参数

在地址后面加上?变量名=变量值&变量名=变量值...

地区查询

步骤

  1. 为查询按钮绑定点击事件
  2. 获取省份名字和城市名字
  3. 创建XMLHttpRequest对象并发起请求
  4. 将获取的地区列表进行map()方法的调用,将每个元素变为一个li标签,并通过join()方法实现拼接变成字符串
  5. 获取要插入标签,并将字符串插入其中

代码

 /**
     * 目标: 根据省份和城市名字, 查询对应的地区列表
    */
    //为查询按钮绑定点击事件
    document.querySelector('.btn-primary').addEventListener('click', () => {
      //获取省份名字和城市名字
      const provincedata = document.querySelector('.province').value;
      const citydata = document.querySelector('.city').value;
      // console.log(provincedata);
      // console.log(citydata);
      //创建XMLHttpRequest对象并发起请求
      const xhrwhere = new XMLHttpRequest();
      xhrwhere.open('GET', `http://hmajax.itheima.net/api/area?pname=${provincedata}&cname=${citydata}`);
      xhrwhere.addEventListener('loadend', () => {
        // console.log(xhrwhere.response);
        console.log(JSON.parse(xhrwhere.response).list);

        //将获取的地区列表进行map()方法的调用,将每个元素变为一个li标签,并通过join()方法实现拼接变成字符串
        const wherestr = JSON.parse(xhrwhere.response).list.map(function (ele) {
          return `<li class="list-group-item">${ele}</li>`
        }).join('');
        //获取要插入标签
        document.querySelector('.list-group').innerHTML = wherestr;
      })

      xhrwhere.send();
    })

如何发起请求的同时进行数据提交

首先得设置请求头,表明要传输数据的格式 setRequestHeader

在发起请求的时候要同时将要传的数据通过参数进行传输 send(data)

小知识:将对象转为JSON字符串格式

const str = JSON.stringify(obj);

数据提交案例之注册用户

步骤:

  1. 为注册按钮绑定点击事件
  2. 创建xhr对象
  3. 带上请求方法和地址
  4. 为xhr绑定loadend事件,并通过回调函数接收响应结果
  5. 配置请求头,如传输数据格式
  6. 发送请求并携带要提交的数据

代码

 /**
     * 目标:使用xhr进行数据提交-完成注册功能
    */
    //为注册按钮绑定点击事件
    document.querySelector('.reg-btn').addEventListener('click', () => {
      //创建xhr对象
      const xhr = new XMLHttpRequest();
      //带上请求方法和地址
      xhr.open('POST', 'http://hmajax.itheima.net/api/register');
      //为xhr对象绑定loadend事件,以便返回响应结果
      xhr.addEventListener('loadend', () => {
        //获取响应结果
        console.log(xhr.response);
      })
      //配置请求头信息 -- 由于要传数据给服务器
      xhr.setRequestHeader('Content-Type', 'application/json');
      //设置请求体数据
      const user = {
        username: "lhwoaini",
        password: "1234567"
      };
      //将数据转换为json格式
      const userStr = JSON.stringify(user);
      //发送请求并携带json格式数据
      xhr.send(userStr);

    })

认识Pormise

一个对象,用于表示一个异步操作的最终完成或失败及其结果值

作用

  • 成功和失败程序,可以关联对应处理程序

  • 了解axios内部原理

如何使用

  1. 创建一个Promise对象
  2. 在构造函数中调用resolve和reject函数
  3. 在Promise对象的回调函数中进行异步操作,并通过判断来执行对应resolve还是reject函数
  4. 分别进行已兑现和已拒绝状态进行不同的关联处理then(result => {}) catch(error => {})
image-20241109220019921

注册用户成功与否来印证Promise对象的作用

步骤

  1. 为注册按钮绑定点击事件
  2. 创建Promise对象
  3. 创建xhr对象
  4. 带上请求方法和地址
  5. 为xhr对象绑定loadend事件,以便返回响应结果
  6. 由于响应结果为JSON格式的字符串,无法进行判断,因此进行数据类型替换
  7. 对响应结果进行判断,以此来判断调用哪个函数 – reslove or reject
  8. 配置请求头信息 – 要传数据给服务器,由于响应结果为JSON格式的字符串,无法进行判断,因此进行数据类型替换
  9. 将数据转换为json格式
  10. 分别调用then和catch进行关联状态的函数
/**
     * 目标:使用xhr进行数据提交-完成注册功能
    */
    //为注册按钮绑定点击事件
    document.querySelector('.reg-btn').addEventListener('click', () => {
      //创建Promise对象
      const p = new Promise((resolve, reject) => {
        //创建xhr对象
        const xhr = new XMLHttpRequest();
        //带上请求方法和地址
        xhr.open('POST', 'http://hmajax.itheima.net/api/register');
        //为xhr对象绑定loadend事件,以便返回响应结果
        xhr.addEventListener('loadend', () => {
          //获取响应结果
          console.log(xhr.response);
          //由于响应结果为JSON格式的字符串,无法进行判断,因此进行数据类型替换
          const reData = JSON.parse(xhr.response);
          console.log(reData);
          //对响应结果进行判断
          if (reData.code == 10000) {
            resolve('成功注册');
          } else {
            reject('因为各种原因注册失败了');
          }

        })
        //配置请求头信息 -- 由于要传数据给服务器
        xhr.setRequestHeader('Content-Type', 'application/json');
        //设置请求体数据
        const user = {
          username: "lhwoain1111",
          password: "1234567"
        };
        //将数据转换为json格式
        const userStr = JSON.stringify(user);
        //发送请求并携带json格式数据
        xhr.send(userStr);
      })
      //分别调用then和catch进行关联状态的函数
      p.then(result => {
        console.log(result);
      }).catch(error => {
        console.log(error);
      })
    })

案例之是否成功获取省份列表

代码:

 /**
     * 目标:使用Promise管理XHR请求省份列表
     *  1. 创建Promise对象
     *  2. 执行XHR异步代码,获取省份列表
     *  3. 关联成功或失败函数,做后续处理
    */
    //创建Promise对象
    const p = new Promise((resolve, reject) => {
      //创建xhr对象
      const xhr = new XMLHttpRequest();
      //配置地址以及请求方法
      xhr.open('GET', 'http://hmajax.itheima.net/api/province');
      //绑定loadend事件,并返回响应结果
      xhr.addEventListener('loadend', () => {
        console.log(xhr.response);
        //将JSON格式的字符串转换为对象,并获取省份列表
        const datalist = JSON.parse(xhr.response);
        console.log(datalist.list);
        //获取要写入标签并写入
        document.querySelector('.my-p').innerHTML = datalist.list.join('<br>')
        //判断是否获取省份成功,并调用对应函数
        if (datalist.message === '获取省份成功') {
          resolve('成功了')
        } else {
          reject('因为不知名原因出错哩')
        }
      })
      //发起请求
      xhr.send();
    })
    //为p的两种状态分别配置两种不同的处理函数
    p.then(result => {
      alert(result);
    }).catch(error => {
      //大多数报错不用让用户显性知道内容
      console.log(error);
    })

AJAX原理

通过[XHR]XMLHttpRequest对象来和服务器进行交互,axios库的底层也是通过XMLHttpRequest来和服务器进行交互,只是将实现细节进行了封装,让操作更加简洁

可以用于某些只需和服务器进行少次交互的静态网站进行使用,减少代码的体积

如何使用XMLHttpRequest

  1. 创建对象
  2. 配置请求方法和url地址–对象.open('请求方法','请求url地址')
  3. 监听loadend事件–即为该对象绑定loadend事件,通过回调函数接收响应结果
  4. 通过对象.send()来发起请求

通过获取省份来进行这个对象的使用

/**
     * 目标:使用XMLHttpRequest对象与服务器通信
     *  1. 创建 XMLHttpRequest 对象
     *  2. 配置请求方法和请求 url 地址
     *  3. 监听 loadend 事件,接收响应结果
     *  4. 发起请求
    */
    //创建对象
    const xhr = new XMLHttpRequest();
    //通过open方法配置请求方法和请求url地址
    xhr.open('GET', 'http://hmajax.itheima.net/api/province');
    //为该对象绑定loadend事件
    xhr.addEventListener('loadend', () => {
      //获取响应结果
      console.log(xhr.response);
      //由于返回的结果为json格式的数据,所以需要转换为对象格式的数据
      const data = JSON.parse(xhr.response);
      console.log(data.list.join('<br>'));
      document.querySelector('.province').innerHTML = data.list.join('<br>');
    })
    //发起一次请求
    xhr.send();

XMLHttpRequest如何添加查询参数

在地址后面加上?变量名=变量值&变量名=变量值...

地区查询

步骤

  1. 为查询按钮绑定点击事件
  2. 获取省份名字和城市名字
  3. 创建XMLHttpRequest对象并发起请求
  4. 将获取的地区列表进行map()方法的调用,将每个元素变为一个li标签,并通过join()方法实现拼接变成字符串
  5. 获取要插入标签,并将字符串插入其中

代码

 /**
     * 目标: 根据省份和城市名字, 查询对应的地区列表
    */
    //为查询按钮绑定点击事件
    document.querySelector('.btn-primary').addEventListener('click', () => {
      //获取省份名字和城市名字
      const provincedata = document.querySelector('.province').value;
      const citydata = document.querySelector('.city').value;
      // console.log(provincedata);
      // console.log(citydata);
      //创建XMLHttpRequest对象并发起请求
      const xhrwhere = new XMLHttpRequest();
      xhrwhere.open('GET', `http://hmajax.itheima.net/api/area?pname=${provincedata}&cname=${citydata}`);
      xhrwhere.addEventListener('loadend', () => {
        // console.log(xhrwhere.response);
        console.log(JSON.parse(xhrwhere.response).list);

        //将获取的地区列表进行map()方法的调用,将每个元素变为一个li标签,并通过join()方法实现拼接变成字符串
        const wherestr = JSON.parse(xhrwhere.response).list.map(function (ele) {
          return `<li class="list-group-item">${ele}</li>`
        }).join('');
        //获取要插入标签
        document.querySelector('.list-group').innerHTML = wherestr;
      })

      xhrwhere.send();
    })

如何发起请求的同时进行数据提交

首先得设置请求头,表明要传输数据的格式 setRequestHeader

在发起请求的时候要同时将要传的数据通过参数进行传输 send(data)

小知识:将对象转为JSON字符串格式

const str = JSON.stringify(obj);

数据提交案例之注册用户

步骤:

  1. 为注册按钮绑定点击事件
  2. 创建xhr对象
  3. 带上请求方法和地址
  4. 为xhr绑定loadend事件,并通过回调函数接收响应结果
  5. 配置请求头,如传输数据格式
  6. 发送请求并携带要提交的数据

代码

 /**
     * 目标:使用xhr进行数据提交-完成注册功能
    */
    //为注册按钮绑定点击事件
    document.querySelector('.reg-btn').addEventListener('click', () => {
      //创建xhr对象
      const xhr = new XMLHttpRequest();
      //带上请求方法和地址
      xhr.open('POST', 'http://hmajax.itheima.net/api/register');
      //为xhr对象绑定loadend事件,以便返回响应结果
      xhr.addEventListener('loadend', () => {
        //获取响应结果
        console.log(xhr.response);
      })
      //配置请求头信息 -- 由于要传数据给服务器
      xhr.setRequestHeader('Content-Type', 'application/json');
      //设置请求体数据
      const user = {
        username: "lhwoaini",
        password: "1234567"
      };
      //将数据转换为json格式
      const userStr = JSON.stringify(user);
      //发送请求并携带json格式数据
      xhr.send(userStr);

    })

认识Pormise

一个对象,用于表示一个异步操作的最终完成或失败及其结果值

作用

  • 成功和失败程序,可以关联对应处理程序

  • 了解axios内部原理

如何使用

  1. 创建一个Promise对象
  2. 在构造函数中调用resolve和reject函数
  3. 在Promise对象的回调函数中进行异步操作,并通过判断来执行对应resolve还是reject函数
  4. 分别进行已兑现和已拒绝状态进行不同的关联处理then(result => {}) catch(error => {})
image-20241109220019921

注册用户成功与否来印证Promise对象的作用

步骤

  1. 为注册按钮绑定点击事件
  2. 创建Promise对象
  3. 创建xhr对象
  4. 带上请求方法和地址
  5. 为xhr对象绑定loadend事件,以便返回响应结果
  6. 由于响应结果为JSON格式的字符串,无法进行判断,因此进行数据类型替换
  7. 对响应结果进行判断,以此来判断调用哪个函数 – reslove or reject
  8. 配置请求头信息 – 要传数据给服务器,由于响应结果为JSON格式的字符串,无法进行判断,因此进行数据类型替换
  9. 将数据转换为json格式
  10. 分别调用then和catch进行关联状态的函数
/**
     * 目标:使用xhr进行数据提交-完成注册功能
    */
    //为注册按钮绑定点击事件
    document.querySelector('.reg-btn').addEventListener('click', () => {
      //创建Promise对象
      const p = new Promise((resolve, reject) => {
        //创建xhr对象
        const xhr = new XMLHttpRequest();
        //带上请求方法和地址
        xhr.open('POST', 'http://hmajax.itheima.net/api/register');
        //为xhr对象绑定loadend事件,以便返回响应结果
        xhr.addEventListener('loadend', () => {
          //获取响应结果
          console.log(xhr.response);
          //由于响应结果为JSON格式的字符串,无法进行判断,因此进行数据类型替换
          const reData = JSON.parse(xhr.response);
          console.log(reData);
          //对响应结果进行判断
          if (reData.code == 10000) {
            resolve('成功注册');
          } else {
            reject('因为各种原因注册失败了');
          }

        })
        //配置请求头信息 -- 由于要传数据给服务器
        xhr.setRequestHeader('Content-Type', 'application/json');
        //设置请求体数据
        const user = {
          username: "lhwoain1111",
          password: "1234567"
        };
        //将数据转换为json格式
        const userStr = JSON.stringify(user);
        //发送请求并携带json格式数据
        xhr.send(userStr);
      })
      //分别调用then和catch进行关联状态的函数
      p.then(result => {
        console.log(result);
      }).catch(error => {
        console.log(error);
      })
    })

案例之是否成功获取省份列表

代码:

 /**
     * 目标:使用Promise管理XHR请求省份列表
     *  1. 创建Promise对象
     *  2. 执行XHR异步代码,获取省份列表
     *  3. 关联成功或失败函数,做后续处理
    */
    //创建Promise对象
    const p = new Promise((resolve, reject) => {
      //创建xhr对象
      const xhr = new XMLHttpRequest();
      //配置地址以及请求方法
      xhr.open('GET', 'http://hmajax.itheima.net/api/province');
      //绑定loadend事件,并返回响应结果
      xhr.addEventListener('loadend', () => {
        console.log(xhr.response);
        //将JSON格式的字符串转换为对象,并获取省份列表
        const datalist = JSON.parse(xhr.response);
        console.log(datalist.list);
        //获取要写入标签并写入
        document.querySelector('.my-p').innerHTML = datalist.list.join('<br>')
        //判断是否获取省份成功,并调用对应函数
        if (datalist.message === '获取省份成功') {
          resolve('成功了')
        } else {
          reject('因为不知名原因出错哩')
        }
      })
      //发起请求
      xhr.send();
    })
    //为p的两种状态分别配置两种不同的处理函数
    p.then(result => {
      alert(result);
    }).catch(error => {
      //大多数报错不用让用户显性知道内容
      console.log(error);
    })

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/912693.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【数据结构】插入排序——直接插入排序 和 希尔排序

直接插入排序 和 希尔排序 一、直接插入排序二、直接插入排序的弊端三、希尔排序&#xff08;1&#xff09;对插入排序的联想&#xff08;2&#xff09;希尔排序的思路 四、直接插入排序和希尔排序效率对比1>随机生成10000个数2>我们随机生成100000个数3>我们随机生成…

基于Tkinter的深度学习图像处理界面开发(二)

现在很多搞算法的人&#xff0c;跑跑代码&#xff0c;比如训练和测试代码搞得飞溜&#xff0c;但想把算法代码打包成一个软件&#xff0c;比如给它包装一个界面&#xff0c;就不会了&#xff0c;有些人会推荐用qt做界面&#xff0c;但qt的上手难度还是比较高&#xff0c;如果我…

【设计模式】结构型模式(四):组合模式、享元模式

《设计模式之结构型模式》系列&#xff0c;共包含以下文章&#xff1a; 结构型模式&#xff08;一&#xff09;&#xff1a;适配器模式、装饰器模式结构型模式&#xff08;二&#xff09;&#xff1a;代理模式结构型模式&#xff08;三&#xff09;&#xff1a;桥接模式、外观…

Scala 中 set 的实战应用 :图书管理系统

1. 创建书籍集合 首先&#xff0c;我们创建一个可变的书籍集合&#xff0c;用于存储图书馆中的书籍信息。在Scala中&#xff0c;mutable.Set可以用来创建一个可变的集合。 val books mutable.Set("朝花惜拾", "活着") 2. 添加书籍 我们可以使用操作符…

Flink安装和Flink CDC实现数据同步

一&#xff0c;Flink 和Flink CDC 1&#xff0c; Flink Apache Flink是一个框架和分布式处理引擎&#xff0c;用于对无界和有界数据流进行有状态计算。 中文文档 Apache Flink Documentation | Apache Flink 官方文档 &#xff1a;https://flink.apache.org Flink 中文社区…

有什么初学算法的书籍推荐?

对于初学算法的读者&#xff0c;以下是一些值得推荐的书籍&#xff1a; 1、算法超简单&#xff1a;趣味游戏带你轻松入门与实践 作者&#xff1a;童晶 著 推荐理由&#xff1a;本书把趣味游戏应用于算法教学&#xff0c;提升读者的学习兴趣&#xff0c;并通过可视化的图解和动…

【数据结构】堆和二叉树(2)

文章目录 前言一、建堆和堆排序1.堆排序 二、二叉树链式结构的实现1.二叉树的遍历 三、链式二叉树的功能函数1.二叉树结点个数2.二叉树叶子结点个数3.二叉树的高度4.二叉树第k层结点个数5. 二叉树查找值为x的结点6.二叉树销毁 总结 前言 接着上一篇博客&#xff0c;我们继续分…

Ubuntu24.04网络异常与应对方案记录

PS: 参加过408改卷的ZJU ghsongzju.edu.cn 开启嘲讽: 你们知道408有多简单吗&#xff0c;操作系统真实水平自己知道就行&#xff5e;&#xff5e; Requested credits of master in UWSC30&#xff0c;in ZJU24&#xff0c;domestic master is too simple dmesg dmesg 是一个用…

就是这个样的粗爆,手搓一个计算器:弧长计算器

作为程序员&#xff0c;没有合适的工具&#xff0c;就得手搓一个&#xff0c;PC端&#xff0c;移动端均可适用。废话不多说&#xff0c;直接上代码。 HTML: <div class"calculator"><label for"radius">圆的半径 (r)&#xff1a;</label&…

ServletContext介绍

文章目录 1、ServletContext对象介绍1_方法介绍2_用例分析 2、ServletContainerInitializer1_整体结构2_工作原理3_使用案例 3、Spring案例源码分析1_注册DispatcherServlet2_注册配置类3_SpringServletContainerInitializer 4_总结 ServletContext 表示上下文对象&#xff0c;…

【论文复现】MSA+抑郁症模型总结(三)

&#x1f4dd;个人主页&#x1f339;&#xff1a;Eternity._ &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; ❀MSA抑郁症模型 热门研究领域&#xff1a;情感计算的横向发展1. 概述2. 论文地址3. 研究背景4. 主要贡献5. 模型结构和代码6. 数据集介绍7. 性…

使用 Umami 部署博客分析工具

Umami 简介 Umami 是一款开源且注重隐私的网站分析工具&#xff0c;可替代 Google Analytics。它提供网站流量和用户行为等见解&#xff0c;但不使用 Cookie 或收集个人数据&#xff0c;符合隐私法规。Umami 轻巧易用&#xff0c;可自行托管。 如果你有自己的博客&#xff0c;…

JAVA笔记 | ResponseBodyEmitter等异步流式接口快速学习

先简单记录下简单使用跟测试&#xff0c;后续再补充具体&#xff0c;最近有用到&#xff0c;简单来说就是后端(服务端)编写个发射器&#xff0c;实现一次请求&#xff0c;一直向前端客户端发射数据&#xff0c;直到发射器执行完毕&#xff0c;模拟ai一句一句回复的效果 Respon…

在IntelliJ IDEA中创建带子模块的SpringBoot工程

前言 在项目开发中&#xff0c;一个工程往往有若干子工程或模块&#xff0c;所以主工程一般是一个容器&#xff0c;本文介绍在IntelliJ IDEA中创建带多模块的SpringBoot工程的详细步骤。 1、首先打开IntellJ IDEA&#xff08;以下简称IDEA&#xff09;,创建一个新项目。假定新…

【LeetCode】每日一题 2024_11_9 设计相邻元素求和服务(构造,哈希)

前言 每天和你一起刷 LeetCode 每日一题~ LeetCode 启动&#xff01; 题目&#xff1a;设计相邻元素求和服务 近几天不知道力扣发什么疯&#xff0c;每日一题出的太抽象了&#xff0c;我题解是写不了一点了 . . . 今天稍微正常了些&#xff0c;就又来更新了~ 代码与解题思路…

如何搭建企业内部知识库?:打造专属智能体,为企业提供高效智能的知识管理

在当今数据爆炸的时代&#xff0c;虽然AI强大&#xff0c;但常规的AI工具或搜索引擎在面对复杂、专业领域的问题时&#xff0c;可能给出模棱两可的回应&#xff0c;无法满足企业精细化的需求。这就是为什么&#xff0c;企业需要一个专属的AI知识库 —— 它不仅能存储你的数据&a…

胶囊网络、MobileNet、坐标注意力机制的应用

文章目录 摘要Abstract1.胶囊网络1.1 动态路由 2.坐标注意力机制3.MobileNet3.1 深度卷积3.2 逐点卷积3.3 深度可分离卷积3.3.1 深度可分离卷积与标准卷积的对比3.3.2 卷积操作的代码实现3.3.2.1 函数原型3.3.2.2 标准卷积3.3.2.3 分组卷积3.3.2.4 深度可分离卷积 3.4 MobileNe…

一个开源、免费(MIT License)、功能强大、可扩展的电动汽车充电控制器和家庭能源管理系统(带私活源码)

项目介绍 evcc是一个开源、免费&#xff08;MIT License&#xff09;、功能强大、可扩展的电动汽车充电控制器和家庭能源管理系统&#xff0c;支持广泛的设备和品牌&#xff0c;提供简单的用户界面和强大的功能。 功能特点 用户界面&#xff1a;简单且清晰的用户界面。 充电器…

Pr 视频过渡:沉浸式视频

效果面板/视频过渡/沉浸式视频 Video Transitions/Immersive Video Adobe Premiere Pro 的视频过渡效果中&#xff0c;沉浸式视频 Immersive Video效果组主要用于 VR 视频剪辑之间的过渡。 自动 VR 属性 Auto VR Properties是所有 VR 视频过渡效果的通用选项。 默认勾选&#x…

[OpenGL]使用OpenGL实现硬阴影效果

一、简介 本文介绍了如何使用OpenGL实现硬阴影效果&#xff0c;并在最后给出了全部的代码。本文基于[OpenGL]渲染Shadow Map&#xff0c;实现硬阴影的流程如下&#xff1a; 首先&#xff0c;以光源为视角&#xff0c;渲染场景的深度图&#xff0c;将light space中的深度图存储…