WebGL笔记:图形旋转的原理和实现

原生webgl学习(八) WebGL实现动画:平移、缩放和旋转 笔者在前面的文章主要是针对二维的静态图形进行开发;但有时候我们需要模型动起来,就像真实世界中的一切运动变化一样。场景如果不是动态的,那么可想而知,我们的世界是多么枯燥乏味。为了让我们开发的图形应用看上去更加高大上,这一节笔者将和大家一起做一个动画的例子;本节的内容用到了前面文章提到过的平移、缩放和旋转变换,如果对这方面还不是很熟悉的同学,可以参考这篇文章:原生webgl学习(三) WebGL中的矩... 阅读详情

旋转

1 )旋转的概念

  • 三维物体的旋转要比位移复杂一点,三维物体的旋转需要满足以下条件:
    • 旋转轴
    • 旋转方向
    • 旋转角度
  • 场景举例
    • 模型站在旋转轴的起点进行旋转
    • 模型要往左转还是往右转,就是旋转的方向
    • 模型旋转的大小就是旋转角度


2 )旋转方向的正负

  • 在webgl中,除裁剪空间之外的大部分功能都使用了右手坐标系
  • 在webgl中,可以暂且将其当成右手坐标系, 下图就是右手坐标系


  • 以上图为例

    • 当物体绕 z 轴,从x轴正半轴向y轴正半轴逆时针旋转时,是正向旋转,反之为负。
    • 当物体绕 x 轴,从y轴正半轴向z轴正半轴逆时针旋转时,是正向旋转,反之为负。
    • 当物体绕 y 轴,从z轴正半轴向x轴正半轴逆时针旋转时,是正向旋转,反之为负。
  • 如下图就是正向旋转

    • 围绕z轴(骑着z轴),从x轴到y轴逆时针转动就是正向旋转


旋转公式

  • 如下,让顶点围绕 z 轴旋转的场景


  • 已知
    • 点A的位置是(ax,ay,az)
    • 点A要围绕z轴旋转β度,转到点B的位置
  • 求:点A旋转后的bx、by位置
  • 解
    • 因为∠β是已知的,∠α 可以通过点 A 得出
    • 所以我们可以得出
      ∠xOB = α + β
      
    • 那我们通过三角函数就可以推出bx、by
    • 设 ∠xOB = θ,则:
      bx = cosθ * |OA|
      by = sinθ * |OA| // 注意这里因为是旋转, 所以 |OA| === |OB|, 统一用 |OA|来表示
      
    • 上面的|OA|是点O到点A的距离,可以直接用点A求出
      |OA| = Math.sqrt(ax * ax + ay * ay)
      
    • 那我们接下来只需要知道cosθ和sinθ的值即可
    • 因为:θ = α + β
    • 所以,我们可以利用和角公式求cosθ和sinθ的值
      cosθ = cos(α + β)
      cosθ = cosα * cosβ - sinα * sinβ
      
      sinθ = sin(α + β)
      sinθ = cosβ * sinα + sinβ * cosα
      
    • 所以
      bx = cosθ * |OA|
      bx = (cosα * cosβ - sinα * sinβ) * |OA|
      bx = cosα * cosβ * |OA| - sinα * sinβ * |OA|
      
      by = sinθ * |OA|
      by = (cosβ * sinα + sinβ * cosα) * |OA|
      by = cosβ * sinα * |OA| + sinβ * cosα * |OA|
      
    • 因为
      cosα * |OA| = ax
      sinα * |OA| = ay
      
    • 所以我们可以简化bx、by的公式
      bx = ax * cosβ - ay * sinβ
      by = ay * cosβ + ax * sinβ
      
    • 上面的bx、by就是我们要求的答案

在着色器中旋转

  • 可以直接在着色器里写旋转公式

    <script id="vertexShader" type="x-shader/x-vertex">
        attribute vec4 a_Position;
        float angle = radians(80.0);
        float sinB = sin(angle);
        float cosB = cos(angle);
        void main() {
            gl_Position.x = a_Position.x * cosB - a_Position.y * sinB;
            gl_Position.y = a_Position.y * cosB + a_Position.x * sinB;
            gl_Position.z = a_Position.z;
            gl_Position.w = 1.0;
        }
    </script>
    
  • radians(float degree) 将角度转弧度

  • sin(float angle) 正弦

  • cos(float angle) 余弦

用js旋转图形

我们将顶点着色器里的正弦值和余弦值暴露给js,便可以用js旋转图形了

<script id="vertexShader" type="x-shader/x-vertex">
    attribute vec4 a_Position;
    uniform float u_SinB;
    uniform float u_CosB;
    void main() {
        gl_Position.x = a_Position.x * u_CosB-a_Position.y * u_SinB;
        gl_Position.y = a_Position.y * u_CosB+a_Position.x * u_SinB;
        gl_Position.z = a_Position.z;
        gl_Position.w = 1.0;
    }
</script>
  • 在js 中修改uniform 变量

    const u_SinB = gl.getUniformLocation(gl.program, 'u_SinB');
    const u_CosB = gl.getUniformLocation(gl.program, 'u_CosB');
    const angle = 0.3;
    gl.uniform1f(u_SinB, Math.sin(angle));
    gl.uniform1f(u_CosB, Math.cos(angle));
    
  • 之后让图形转起来

    !(function ani() {
        angle += 0.01;
        gl.uniform1f(u_SinB, Math.sin(angle));
        gl.uniform1f(u_CosB, Math.cos(angle));
        gl.clear(gl.COLOR_BUFFER_BIT);
        gl.drawArrays(gl.TRIANGLES, 0, 3);
        requestAnimationFrame(ani);
    })()
    

完整代码

<canvas id="canvas"></canvas>
<script id="vertexShader" type="x-shader/x-vertex">
  attribute vec4 a_Position;
  uniform float u_SinB;
  uniform float u_CosB;
  void main() {
      gl_Position.x = a_Position.x * u_CosB - a_Position.y * u_SinB;
      gl_Position.y = a_Position.y * u_CosB + a_Position.x * u_SinB;
      gl_Position.z = a_Position.z;
      gl_Position.w = 1.0;
  }
</script>
<script id="fragmentShader" type="x-shader/x-fragment">
  void main() {
      gl_FragColor = vec4(1.0,1.0,0.0,1.0);
  }
</script>
<script type="module">
  import { initShaders } from './utils.js';
  const canvas = document.getElementById('canvas');
  canvas.width = window.innerWidth;
  canvas.height = window.innerHeight;
  const gl = canvas.getContext('webgl');

  const vsSource = document.getElementById('vertexShader').innerText;
  const fsSource = document.getElementById('fragmentShader').innerText;
  initShaders(gl, vsSource, fsSource);

  const vertices = new Float32Array([
    0.0, 0.1,
    -0.1, -0.1,
    0.1, -0.1
  ]);

  const vertexBuffer = gl.createBuffer();
  gl.bindBuffer(gl.ARRAY_BUFFER, vertexBuffer);
  gl.bufferData(gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW);
  const a_Position = gl.getAttribLocation(gl.program, 'a_Position');
  gl.vertexAttribPointer(a_Position, 2, gl.FLOAT, false, 0, 0);
  gl.enableVertexAttribArray(a_Position);

  // 获取Uniform变量
  const u_SinB = gl.getUniformLocation(gl.program, 'u_SinB')
  const u_CosB = gl.getUniformLocation(gl.program, 'u_CosB')
  // 修改uniform 变量
  let angle = 0.3
  gl.uniform1f(u_SinB, Math.sin(angle))
  gl.uniform1f(u_CosB, Math.cos(angle))

  gl.clearColor(0.0, 0.0, 0.0, 1.0);
  gl.clear(gl.COLOR_BUFFER_BIT);
  gl.drawArrays(gl.TRIANGLES, 0, 3);

  !(function ani() {
    angle += 0.01;
    gl.uniform1f(u_SinB, Math.sin(angle));
    gl.uniform1f(u_CosB, Math.cos(angle));
    gl.clear(gl.COLOR_BUFFER_BIT);
    gl.drawArrays(gl.TRIANGLES, 0, 3);
    requestAnimationFrame(ani);
  })()
</script>
第四节 WebGL中的图形变换:旋转、平移和缩放 在WebGL中,如果我们想实现更高级的动态场景,或者是对物体进行坐标变换,那么旋转、平移和缩放必不可少。这些变换所涉及的是一些矩阵运算,先从二维平面讲起,再推导至三维空间。下面分别对这几种变换进行一个讲解: 学习交流欢迎加群:789723098,博主会将一些demo整理共享 1 旋转变换 试想一下,如果当一个场景只是静态的,没有动画,那将是多么令人乏味的画面,而旋转变换的加入将会使场景的动画... 阅读详情

相关推荐

WEBGL保姆级教程(十):WebGL高级图形技术之动画效果实现

WebGL动画实现指南:核心原理与实战案例 本文系统讲解了WebGL动画的实现技术,主要包括:1)动画核心原理:通过渲染循环(requestAnimationFrame)连续更新模型状态实现动态效果;2)五大动画类型:变换动画、顶点动画、骨骼动画、粒子动画和状态动画;3)关键技术:时间控制(deltaTime)、插值计算(lerp/slerp)和矩阵变换;4)实战案例:包含立方体复合变换、平面波浪顶点动画和Three.js骨骼动画的实现代码。文章还提供了性能优化建议,如减少绘制调用、使用实例化渲染等,帮助开

分享知识,拥抱变化 1365

webgl图形平移、缩放、旋转

在webgl中将图形进行平移、旋转、缩放的操作称为变换或仿射变换,图形的仿射变换涉及到顶点位置的修改,通过顶点着色器是比较直接的方式。本文通过着色器实现对webgl图形的仿射变换。

qq_37987033的博客 2065

WebGL入门(八)-通过旋转矩阵实现图形(三角形)绕Z轴的旋转

通过旋转矩阵实现图形的旋转1.旋转效果展示2.旋转矩阵推理3.使用旋转矩阵要点3.1声明旋转矩阵3.2获取旋转矩阵u_RotateMatrix的存储地址3.3向旋转矩阵u_RotateMatrix传值4.demo代码 1.旋转效果展示 如上图,三角形逆时针旋转了60度,是通过旋转矩阵实现的旋转效果。先来看看它的实现原理与实现过程 2.旋转矩阵推理 如上,与平移矩阵与一样,旋转推理也分三步: 第一步介绍矩阵变换的形式。 第二步由旋转等式类比矩阵变换推算出旋转矩阵(行主序)。 第三步由行主序的旋转矩阵推理

点燃火柴的博客 2829

webgl——绘制一个旋转的彩色立方体(四)

文章目录前言一、整体代码以及实现效果二、绘制步骤1.构建顶点数据2.通过顶点索引构建立方体总结 前言 前面文章介绍了如何通过多点来绘制图形,通过建立缓冲区对象,将多个数据传入到缓冲区中;然后 webgl 进行读取缓冲区中的数据进行渲染。上个例子绘制 “F” 的坐标点不是很多;但是如果我们绘制一个立方体。如果还跟之前一样的绘制方式;立方体的每一个面由两个三角形组成,每个三角形有三个顶点,所以每个月需要有六个顶点,那么顶点数据需要有 36 个,我们会发现其实我们只需要用 8 个顶点来进行绘制立方体,但是如何

jiegiser博客 1347

WEBGL保姆级教程(十一):WebGL高级图形技术之交互与用户输入

本文介绍了WebGL交互开发的核心技术与实现方法。主要内容包括:1)WebGL交互原理,通过JavaScript事件捕获用户输入,将2D屏幕坐标转换为3D场景坐标;2)关键实现技术,包括坐标映射、射线检测和常见交互事件处理;3)三个典型交互案例:鼠标控制模型旋转、键盘控制相机移动和鼠标点击选择3D物体;4)性能优化建议,如事件节流、批处理检测和使用WebWorkers;5)开发注意事项,包括坐标系统一致性和移动设备适配等。文章通过完整代码示例,帮助开发者从基础到进阶掌握WebGL交互开发的关键技术。

分享知识,拥抱变化 763

HTML5结合WebGL实现3D旋转球体特效

在三维空间中,任意刚体的姿态可以通过围绕三个正交坐标轴的一系列旋转来描述。这种旋转体系中最常用的就是欧拉角,它由三个独立的角度参数构成:yaw(偏航角)、pitch(俯仰角)和roll(翻滚角),分别对应于绕Y轴、X轴和Z轴的旋转。Yaw(偏航):绕Y轴(垂直轴)旋转,决定物体“朝向”哪个方向。例如飞机左右转向。Pitch(俯仰):绕X轴(横向轴)旋转,决定物体向上或向下倾斜的程度。如抬头低头。Roll(翻滚)

weixin_35756130的博客 1532

WebGL入门(六)-通过坐标计算实现图形的平移、旋转和缩放变换

通过坐标计算实现图形的移动、旋转和缩放变换1.demo效果 1.demo效果

点燃火柴的博客 1784

WebGL长方体动态变换项目:旋转与缩放

WebGL(Web Graphics Library)是一种JavaScript API,它提供了一个用于在任何兼容的Web浏览器中无需插件就可以进行3D和2D图形渲染的标准方式。它将OpenGL ES 2.0的标准应用到了网页中,使得开发者能够在网页上绘制出复杂的图形。在现实世界中,要观察一个物体,需要一个相机或眼睛作为观察的起点。在WebGL中,虚拟相机用于定义观察世界的方式,它包含位置、朝向和视野范围等属性。虚拟相机的重要性在于,它决定了用户的观察视角,影响了3D场景的视觉效果和用户的交互体验。

weixin_42590539的博客 1246

WebGL系列教程七(二维及三维旋转、平移、缩放)

上一篇我们讲了如何进行立方体的纹理贴图,为了方便立方体的贴图后效果的展示,我们对立方体进行了旋转,但代码中并没有进行体现,这一节我们来讲讲旋转、平移、缩放。实际上,在WebGL中进行旋转、平移、缩放只需要乘以相应的旋转、平移、缩放矩阵即可。本文我们通过梳理二维及三维的旋转、平移、缩放矩阵,搞明白了旋转、平移、缩放对应的矩阵,并在WebGL中进行了实验操作,实现了一个立方体的旋转。本文在理解上有一定的难度,尤其是矩阵的变换,需要读者具有一定的线性代数知识,希望读者仔细体会,回见~

AIGIS的博客 1695

Codesys电子凸轮从入门到应用:手把手教你用MC_CamIn/MC_CamOut实现主从轴同步

本文详细介绍了如何在Codesys平台上使用MC_CamIn和MC_CamOut功能块实现电子凸轮的主从轴同步控制。从环境配置、轴使能到凸轮表创建与动态切换,提供了完整的程序编写指南和调试技巧,帮助工程师快速掌握工业自动化中的高精度运动控制技术。

weixin_26878995的博客 277

Angular 相关的知识点和项目汇总

Angular 知识点和项目汇总

weixin_45428910的博客 582

Threejs/WebGL中旋转变换的原理

在WebGL中,旋转矩阵通常是一种特殊的正交矩阵,它用于在三维空间中执行旋转变换。旋转变换属于正交变换,正交变换是一种线性变换,它保持向量的长度和角度不变,同时保持向量空间的正交性。在上图中,我们把旋转矩阵Rz应用于一个三角形,把他绕Z轴旋转90度,左边是旋转之前的三角形,右图是应用变换矩阵Rz(90度),即绕Z轴(垂直屏幕向外)旋转90度之后的三角形。另外,正向旋转可以用右手法则来确定,想象一下,用右手握住旋转轴,且大拇指的方向指向这个轴的正方向,则其他手指所指的方向就是正向旋转。

求上得中,求中得下 1214

AWS入门实践-如何在AWS云上创建一个内外网隔离的生产环境

在 AWS 上建立一个内外网分离的生产环境,可以减少应用服务的暴露面,有效的保证你的应用服务器的安全。通常我们会将web应用放在外网的子网内,数据库服务器等放在内网的子网。我们将按照下图来部署动手实践环境,实现在public subnet的EC2虚拟机可以直接通过互联网可以访问,在Private subnet的EC2虚拟机不能通过互联网直接访问,但是却可以在内部来访问互联网安装应用等等。

weixin_39108752的博客 2996

【愚公系列】2023年12月 WEBGL专题-图形平移、缩放、旋转

图形平移、缩放、旋转是计算机图形学中常用的操作,用来改变图像的位置、大小和方向。平移:平移是将图形在二维平面上沿着一个方向移动一段距离,通常用一个二维向量表示平移的距离。在计算机图形学中,可以通过修改坐标系来实现平移操作。缩放:缩放是将图形按照一定比例进行放大或缩小,在计算机图形学中,通常使用缩放矩阵来进行缩放操作。缩放矩阵中,对角线上的元素表示沿着坐标轴的缩放比例,非对角线上的元素表示斜线方向的缩放比例。旋转:旋转是将图形围绕某个点或轴旋转一定角度,通常使用旋转矩阵来实现。

愚公智库 1万+

DySAT+: Enhancing Dynamic Graph Representation Learning with Multi-Head Self-Attention and Temporal-

本文深入探讨了DySAT+模型在动态图表示学习中的创新应用,通过多头时空注意力机制和层级信息融合策略,有效解决了动态图数据中的时间维度信息捕捉和结构演变动态适应问题。该模型在社交网络异常检测和金融交易网络分析等场景中表现出色,显著提升了预测准确率和响应速度。

weixin_29035405的博客 337

人工智能在文学领域的应用:创作无限可能的智能作家

人工智能在文学领域的应用:创作无限可能的智能作家 作者:禅与计算机程序设计艺术 1. 背景介绍 人工智能技术近年来飞速发展,在各个领域都有广泛应用。文学创作作为人类最高级的智力活动之一,也逐渐受到人工智能技术的影响和改变。随着自然语言处理、生成式模型等人工智能

AI天才研究院 1110

WebGL笔记:矩阵旋转运算的原理和实现

因为a、b、x、y都是实数,所以其结果也是实数 上图中,矩阵m乘以向量v 会得到两个结果,即和 这两个结果会构成一个新的向量v’(x’,y’) 这时我们可以将其和数学里的旋转公式做一下比较 点A(ax,ay)围绕z轴旋β度,其旋转后的位置是点B(bx,by),则: 对比上面的两组公式,试想一下 向量v是可以当成一个点位 那我现在就让向量v代表的位置,就是点A的位置。 那么矩阵m乘以向量v,是不是可以让向量v代表的这个点位旋转β度呢? 如果可以,那么矩阵里的元素应该满足什么条件呢? 满足以下条件即可 这

Wang的专栏 629

宇树G1语音助手完整开发指南(上)——从零构建智能知识库对话系统

本文将详细介绍如何为宇树G1人形机器人开发一个,实现"唤醒 → 对话 → 查询 → 回复"的智能助手功能。

m0_47999117的博客 789

WebGL简易教程(五):图形变换(模型、视图、投影变换)

详细讲解了OpenGL\WebGL关于绘制场景的图形变换过程,并推导了其图形变换矩阵。主要包括模型变换、视图变换以及投影变换。

Charlee44的技术驿站 5069

OAI-5G开源通信平台实践(一)-安装 部署及RFsimulator基本测试

OAI (Open Air Interface) 是目前开源5G/4G项目中最完善、最成熟的一个,并且仍然在持续更新。其包含基站、终端及核心网网元的代码,可基于x86\arm+射频卡搭建实际硬件平台,也可在x86平台上对rf\phy等层进行模拟,做各网元协议栈的单独测试验证。本文总结了x86平台下,oai的安装及运行方式。包括NTN分支和主分支的rf simulator、nos1、端到端部署等场景的验证流程,同时总结了验证过程中遇到的问题及解决方法。

十年通信老兵的技术修炼之路——从3G到5G,从地面基站到卫星通信。 2969

一文就够-InfiniBand 技术全面解析:从原理到实践的通俗易懂指南

想象一下,在一个超级数据中心里,成千上万台服务器需要像蜜蜂群体一样高效协作。如果用传统的网络连接,就像让每只蜜蜂都排着队传递消息,效率极低。InfiniBand(简称 IB)就是为了解决这种 "通信拥堵" 而生的高速网络技术,它专门为高性能计算(HPC)、数据中心和云计算环境设计,就像给服务器之间搭建了多条高速公路,让数据可以飞驰而过。

jundao1997的专栏 1396

WebGL与Three.js:3D图形在Web上的应用

WebGL(Web Graphics Library)是一种JavaScript API,用于在任何兼容的Web浏览器中进行硬件加速的3D图形渲染,无需插件。它基于OpenGL标准,直接集成到HTML5的Canvas元素中。WebGL使得开发者能够在网页上实现复杂的3D视觉效果。Three.js是一个流行的JavaScript库,它封装了WebGL的复杂性,提供了一个更易用的接口来创建3D内容。Three.js简化了许多WebGL的底层工作,如顶点缓冲、着色器管理、纹理加载等,让开发者能够专注于构建3D场景

天涯学馆 3237

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

(九)WebGL中平移矩阵实现原理和使用方法详解

创建平移矩阵:我们定义了函数来生成一个平移矩阵。该矩阵会将物体平移到位置。顶点着色器:在顶点着色器中,我们计算,并将平移矩阵与视图矩阵和投影矩阵相乘来实现物体的变换。JavaScript传递矩阵:我们通过将矩阵传递给着色器,完成平移变换。通过这种方式,我们就能够在WebGL中实现平移矩阵的变换,将物体从一个位置移动到另一个位置。

cuijiying的博客 2013

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

WebGL入门绘制、矩阵平移和旋转

WebGL(Web Graphics Library)是一种用于在网页上渲染交互式3D和2D图形的JavaScript API。它不需要任何插件,直接利用电脑的GPU(图形处理器)来加速渲染,是现代浏览器进行游戏开发、数据可视化和三维建模的基石。核心优势:原生集成:与HTML5、Canvas和DOM完美结合。硬件加速:直接调用GPU,性能极高。跨平台:只要浏览器支持,Windows、macOS、Linux乃至移动端均可运行。

qq_28372005的博客 669

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

[IG] WebGL按钮控制旋转

注明 该代码源于Interactive Computer Graphics Edward Angel and Dave Shreiner Eighth Edition, Pearson Education, 2020 为更好理解此代码,仅添加部分注释 WebGL 按钮控制旋转HTML文件JavaScript文件 大概思路 关于旋转的思路,请移步此处 该代码使用了按钮控制和键盘按键控制,思路都是一样的。 对于实现反向旋转功能:只需要把每次旋转的角度 theta 取反就可以了,这里是设置了Direct.

土豆大叔的博客 648

掌握WebGL图形学:ICG-WebGL项目实战指南

ICG-WebGL是基于《交互式计算机图形学——基于WebGL的自顶向下方法(第七版)》教材的现代WebGL学习项目,为计算机图形学开发者和学习者提供了一套完整的WebGL编程实践体系。该项目重构了官方示例代码,采用现代前端开发工具链,包含12个章节的完整示例和练习题实现,帮助开发者从零构建WebGL图形渲染技能。 ## 项目概览:现代WebGL学习框架 ICG-WebGL项目不仅是一个代码库

gitblog_00079的博客 613
上一篇: 数据结构与算法之贪心: LeetCode 860. 柠檬水找零 (Ts, Py, Go版)
下一篇: AIGC: 关于ChatGPT中Prompt模板的优化
Wang's Blog
博客等级 码龄12年 7438粉丝 2421原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

打赏作者

Wang's Blog

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值