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

【零基础学WebGL】矩阵变换 矩阵变量 GLSL ES语言中,通过关键字mat2、mat3、mat4声明矩阵,并提供内置函数mat2()、mat3()、mat4()构造矩阵。 支持三种方式初始化矩阵: 从第一列开始,逐列指定元素的值。这里与,高数中习惯按照逐行书写矩阵不同。 只传入一个值,作为对角矩阵的对角线值; 传入多个向量; 如下代码初始化2x2单位矩阵: // 按照列优先,逐列指定每个元素 mat2 aMat = mat2( 1.0, 0, // 第一列 0, 1.0 // 第二列 ); // 构造对角矩阵,值 阅读详情

矩阵

  • 矩阵(Matrix)是一个按照矩形纵横排列的复数集合
    • 矩阵就像一个矩形的阵盘,通过其中纵横排列的元素
    • 我们可以摆出不同功能的阵法,比如位移矩阵、旋转矩阵、缩放矩阵 …
    • 在矩阵中的每一行,或者每一列数字构成的集合,可以视之为向量


  • 关于复数 z = a + bi
    • 实数: b = 0
      • 有理数: 整数和分数
      • 无理数: eg: 圆周率 π, sqrt(2)
    • 虚数: b != 0

向量

  • 向量,又叫矢量,它是一个用于表示方向和量的对象
  • 在webgl 里的向量有1维向量、2维向量、3维向量和4维向量
    • 1维向量中有1个数字,对应的是单轴坐标系里的点位
    • 2维向量中有2个数字,对应的是2维坐标系里的点位
    • 3维向量中有3个数字,对应的是3维坐标系里的点位
    • 4维向量中有4个数字,对应的是3维坐标系里的点位,外加一个附加数据,至于这个数据是什么,要看我们的项目需求

矩阵和向量的乘法

  • 矩阵和向量的乘法图


  • 矩阵乘以向量时,向量是几维的,那矩阵中就应该有几个向量
  • 如上图向量v 是2维的,那么矩阵中就有2组向量,这两组向量可以是横着的两组向量,也可以是竖着的两组向量
    • 横着的两组向量是:向量(a,b)、向量(e,f)
    • 竖着的两组向量是:向量(a,e)、向量(b,f)
    • 横着的两组遵循的规则是行主序,即将矩阵中的一行数据视之为一个向量
    • 竖着的两组遵循的规则是列主序,即将矩阵中的一列数据视之为一个向量
  • 我们是使用行主序,还是列主序,这就得看规则的定制者
  • 在webgl 里,矩阵元素的排列规则是列主序
  • 数学中常用的写法是行主序,所以我们接下来就用行主序例子
    • 矩阵和向量相乘的规则就是让矩阵中的每个向量和向量v相乘。
    • 向量和向量相乘,就是在求向量的点积,其结果是一个实数,而不再是向量
    • 比如上图中,向量(a,b)乘以向量v(x,y)的结果是:
      a * x + b * y
      
  • 因为a、b、x、y都是实数,所以其结果也是实数
  • 上图中,矩阵m乘以向量v 会得到两个结果,即ax+by和ex+fy
  • 这两个结果会构成一个新的向量v’(x’,y’)
    x' = a * x + b * y
    y' = e * x + f * y
    
  • 这时我们可以将其和数学里的旋转公式做一下比较
  • 点A(ax,ay)围绕z轴旋β度,其旋转后的位置是点B(bx,by),则:
    bx = cosβ * ax - sinβ * ay
    by = sinβ * ax + cosβ * ay
    
  • 对比上面的两组公式,试想一下
  • 向量v是可以当成一个点位
  • 那我现在就让向量v代表的位置,就是点A的位置。
  • 那么矩阵m乘以向量v,是不是可以让向量v代表的这个点位旋转β度呢?
  • 如果可以,那么矩阵里的元素应该满足什么条件呢?
  • 满足以下条件即可
    a = cosβ
    b = -sinβ
    e = sinβ
    f = cosβ
    
  • 这样,用矩阵乘以向量的方法得到的旋转结果和用数学公式得到的结果就是一样的,即;
    a * x + b * y = cosβ * ax - sinβ * ay
    e * x + f * y = sinβ  *ax + cosβ * ay
    


  • 最终我们就可以用矩阵乘以向量的方式让点p旋转β度
  • 也就是说,可以用矩阵乘以向量的方式求向量OA旋转了 β\betaβ° 的位置


### 在着色器中书写矩阵

1 ) 核心代码

  • 在着色器中建立矩阵对象
    • mat2 是二维矩阵对象
<script id="vertexShader" type="x-shader/x-vertex">
    attribute vec4 a_Position;
    float angle = radians(40.0);
    float sinB = sin(angle);
    float cosB = cos(angle);
    mat2 m2 = mat2(
      cosB, sinB,
      -sinB, cosB
    );
    void main() {
      gl_Position = vec4(
        m2 * vec2(a_Position),
        a_Position.z, a_Position.w
      );
    }
</script>

2 )完整代码

<canvas id="canvas"></canvas>
<script id="vertexShader" type="x-shader/x-vertex">
  attribute vec4 a_Position;
  float angle = radians(40.0);
  float cosB = cos(angle);
  float sinB = sin(angle);
  // 列主序
  mat2 m2 = mat2(
    cosB, sinB,
    -sinB, cosB
  );
  void main() {
    gl_Position = vec4(
      m2 * vec2(a_Position),
      a_Position.z, a_Position.w
    );
  }
</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);
  gl.clearColor(0.0, 0.0, 0.0, 1.0);
  gl.clear(gl.COLOR_BUFFER_BIT);
  gl.drawArrays(gl.TRIANGLES, 0, 3);
</script>

用js建立矩阵对象并传递给着色器

1 )核心代码

  • 在顶点着色器中建立uniform变量

    <script id="vertexShader" type="x-shader/x-vertex">
        attribute vec4 a_Position;
        uniform mat2 u_Matrix;
        void main() {
          gl_Position = vec4(
            u_Matrix * vec2(a_Position),
            a_Position.z, a_Position.w
          );
        }
    </script>
    
  • 获取并修改uniform 变量

    const u_Matrix = gl.getUniformLocation(gl.program, 'u_Matrix');
    let angle = 0.2;
    const [sinB, cosB] = [Math.sin(angle), Math.cos(angle)];
    const matrix = [
        cosB, sinB,
        -sinB, cosB
    ];
    gl.uniformMatrix2fv(u_Matrix, false, matrix);
    
  • 后面我们也可以在其中添加动画

    const u_Matrix = gl.getUniformLocation(gl.program, 'u_Matrix');
    let angle = 0.2;
    !(function animate() {
        angle += 0.02;
        const [sinB, cosB] = [Math.sin(angle), Math.cos(angle)];
        const matrix = [
            cosB, sinB,
            -sinB, cosB
        ];
        gl.uniformMatrix2fv(u_Matrix, false, matrix);
        gl.clear(gl.COLOR_BUFFER_BIT);
        gl.drawArrays(gl.TRIANGLES, 0, 3);
        requestAnimationFrame(animate)
    })()
    

2 )完整代码

<canvas id="canvas"></canvas>
<script id="vertexShader" type="x-shader/x-vertex">
  attribute vec4 a_Position;
  // 列主序
  uniform mat2 u_Matrix;
  void main() {
    gl_Position = vec4(
      u_Matrix * vec2(a_Position),
      a_Position.z,a_Position.w
    );
  }
</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);

  const u_Matrix = gl.getUniformLocation(gl.program, 'u_Matrix');
  let angle = 0.5;
  const sinB = Math.sin(angle);
  const cosB = Math.cos(angle);
  const matrix = [
    cosB, sinB,
    -sinB, cosB
  ];
  gl.uniformMatrix2fv(u_Matrix, false, matrix);
  gl.clearColor(0.0, 0.0, 0.0, 1.0);
  gl.clear(gl.COLOR_BUFFER_BIT);
  gl.drawArrays(gl.TRIANGLES, 0, 3);

  !(function animate() {
    angle += 0.05;
    const sinB = Math.sin(angle);
    const cosB = Math.cos(angle);
    const matrix = [
      cosB, sinB,
      -sinB, cosB
    ];
    gl.uniformMatrix2fv(u_Matrix, false, matrix);
    gl.clear(gl.COLOR_BUFFER_BIT);
    gl.drawArrays(gl.TRIANGLES, 0, 3);
    requestAnimationFrame(animate);
  })()
</script>
  • 以上是最简单的二维矩阵,我们也可以给顶点着色器一个四维矩阵

四维矩阵在着色器里的处理

  • 应用原理和二维矩阵是一样的

1 )核心代码

<script id="vertexShader" type="x-shader/x-vertex">
    attribute vec4 a_Position;
    float angle = radians(10.0);
    float cosB = cos(angle);
    float sinB = sin(angle);
    mat4 m4 = mat4(
      cosB, sinB, 0.0, 0.0,
      -sinB, cosB, 0.0, 0.0,
      0.0, 0.0, 1.0, 0.0,
      0.0, 0.0, 0.0, 1.0
    );
    void main() {
      gl_Position = m4 * a_Position;
    }
</script>

2 )完整代码

<canvas id="canvas"></canvas>
<script id="vertexShader" type="x-shader/x-vertex">
  attribute vec4 a_Position;
  float angle = radians(10.0);
  float cosB = cos(angle);
  float sinB = sin(angle);
  // 列主序
  mat4 m4 = mat4(
    cosB, sinB, 0.0, 0.0,
    -sinB, cosB, 0.0, 0.0,
    0.0, 0.0, 1.0, 0.0,
    0.0, 0.0, 0.0, 1.0
  );
  void main() {
    gl_Position = m4 * a_Position;
  }
</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);

  gl.clearColor(0.0, 0.0, 0.0, 1.0);
  gl.clear(gl.COLOR_BUFFER_BIT);
  gl.drawArrays(gl.TRIANGLES, 0, 3);
</script>

用js向顶点着色器传递四维矩阵

1 )核心代码

const u_Matrix = gl.getUniformLocation(gl.program, 'u_Matrix');
let angle = 0.1;
const [sinB, cosB] = [Math.sin(angle), Math.cos(angle)];
const matrix = [
    cosB, sinB, 0.0, 0.0,
    -sinB, cosB, 0.0, 0.0,
    0.0, 0.0, 1.0, 0.0,
    0.0, 0.0, 0.0, 1.0
];
gl.uniformMatrix4fv(u_Matrix, false, matrix);

2 )完整代码

<canvas id="canvas"></canvas>
<script id="vertexShader" type="x-shader/x-vertex">
  attribute vec4 a_Position;
  // 列主序
  uniform mat4 u_Matrix;
  void main() {
    gl_Position = u_Matrix * a_Position;
  }
</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);

  const u_Matrix = gl.getUniformLocation(gl.program, 'u_Matrix');
  let angle = 0.5;
  const sinB = Math.sin(angle);
  const cosB = Math.cos(angle);
  const matrix = [
    cosB, sinB, 0, 0,
    -sinB, cosB, 0, 0,
    0, 0, 1, 0,
    0, 0, 0, 1
  ];
  gl.uniformMatrix4fv(u_Matrix, false, matrix);

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

  !(function animate() {
    angle += 0.05;
    const sinB = Math.sin(angle);
    const cosB = Math.cos(angle);
    const matrix = [
      cosB, sinB, 0, 0,
      -sinB, cosB, 0, 0,
      0, 0, 1, 0,
      0, 0, 0, 1
    ];
    gl.uniformMatrix4fv(u_Matrix, false, matrix);

    gl.clear(gl.COLOR_BUFFER_BIT);
    gl.drawArrays(gl.TRIANGLES, 0, 3);
    requestAnimationFrame(animate);
  })()
</script>
原生webgl学习(三) WebGL中的矩阵运算:平移、旋转和缩放 本专栏所有文章示例代码均可在我的git码云上获取,读者可自行下载:https://gitee.com/babyogl/learnWebGL,本文示例代码在chapter-02的color-triangle-01,引用文件都在libs文件夹下;在上一节中,笔者介绍了如何用WebGL绘制一个三角形:原生webgl学习(二) 用WebGL绘制一个三角形,那我们会想,画一个三角形有什么了不起的?的确,画一... 阅读详情

相关推荐

第四节 WebGL中的图形变换:旋转、平移和缩放

在WebGL中,如果我们想实现更高级的动态场景,或者是对物体进行坐标变换,那么旋转、平移和缩放必不可少。这些变换所涉及的是一些矩阵运算,先从二维平面讲起,再推导至三维空间。下面分别对这几种变换进行一个讲解: 学习交流欢迎加群:789723098,博主会将一些demo整理共享 1 旋转变换 试想一下,如果当一个场景只是静态的,没有动画,那将是多么令人乏味的画面,而旋转变换的加入将会使场景的动画...

Bruce_wjh的博客 5122

webgl变换矩阵理论详解

在webgl中将图形进行平移、旋转、缩放等操作时可以在着色器中使用数学表达式来操作,但是这样并不是最好的方式,当进行的变换比较复杂,如“旋转后平移再缩放”这样的场景,每次都要先重新计算表达式,然后在着色器中去更改它,这样很不方便,因此,出现了另一种数学手段——变换矩阵,变换矩阵非常适合处理计算机图形。本文对变换矩阵的理论进行讲解。矩阵运算、矩阵变换的一般规则变换矩阵进行图形变换实例。

qq_37987033的博客 2015

JavaScript WebGL 矩阵

引子 本以为可以开始尝试三维的效果了,查了一下资料之后发现要先了解矩阵。在这里集中收集一下相关基础知识点。 Origin My GitHub 简介 简单来说,矩阵(Matrix)是数字按行和列的矩形排列。一般描述先行后列,例如下面 2×3 矩阵: 矩阵中每个元素表示也可以根据行和列标记,例如 a1,2 表示第 1 行的第 2 列元素。 在应用数学学科中,矩阵常见于统计分析。 在物理学中,矩阵于电路学、力学、光学和量子物理中都有应用。 计算机科学中,三维动画制作需要用到矩阵。 单位矩阵 单位矩阵有如

XXHolic 1625

WebGL矩阵变换

对于简单的变换,你可以使用数学表达式来实现。但是当情形逐渐变得复杂时,你很快就会发现利用表达式运算实际上相当繁琐。比如,下图显示了一个“旋转后平移”的过程,如果使用数学表达式,我们就需要两种变换的等式叠加,获得一个新的等式,然后在顶点着色器中实现。

求上得中,求中得下 1657

原生webgl学习(八) WebGL实现动画:平移、缩放和旋转

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

Bruce_wjh的博客 4901

【WebGL初学系列之五】旋转,平移,缩放

nbcoder.com地址:http://nbcoders.com/webgl-chu-xue-xi-lie-zhi-wu-ai.html     最近把WebGL做的相关Demo已经放在 http://www.nbcoders.com 上了,这样就可以直观的进行看效果。     地址:    http://lab.nbcoders.com/ixshells/      本文旋转平移缩放

ixshells的专栏 5254

【愚公系列】2023年12月 WEBGL专题-图形旋转矩阵

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

愚公智库 1万+

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

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

点燃火柴的博客 2829

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

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

cuijiying的博客 2013

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

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

weixin_35756130的博客 1532

群晖NAS从入门到精通的所有帖子汇总,只要这一篇就够了

本站陆陆续续的转载、原创帖子也有十几二十篇了,从不同的角度对群晖NAS的各种骚操作都有深入的讲解,虽然很多文章都不是讲的很深入,但是针对小白入门已经是足够了,希望对小白来说是一个入门,群晖NAS的大佬们勿喷,哪里写的不对的,请随时留言西安SEO优化站长一定在第一时间纠正修改。

西安SEO优化网站资源 8万+

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

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

AIGIS的博客 1695

【NVIDIA Jetson Orin系列 - 安装NVIDIA SDK Manager】

NVIDIA Jetson Orin - 安装NVIDIA SDK Manager

dally2的博客 2695

WebGL实现立方体旋转动画

立方体旋转动画 本文是WebGL电子书的1.10节内容 要通过WebGL渲染出立方体旋转的动画效果,你首要了解“帧”这个概念,比如你观看的视频其实就是一帧一帧的图片连续播放的效果,只要图片刷新的频率的不是太低,人的眼睛都不会察觉,一般30~60FPS就可以。 WebGL如何产生一帧一帧的图片,这个很简单,执行一次绘制函数gl.drawArrays(),WebGL图形系统就会通知GPU渲染管线处理顶...

u014291990的博客 1837

项目管理——14规划绩效域论文套路

规划绩效域论文套路

Flee Elf 1153

服务部署之配置WSUS更新服务(基于Windows配置 Server 2022)

服务部署之配置WSUS更新服务(基于Windows配置 Server 2022)

2301_77192876的博客 2216

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

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

qq_28372005的博客 669

使用Google Earth Engine下载JRC全球水体数据

通过Google Earth Engine平台和提供的源代码,研究人员和水资源管理者可以方便地获取和利用这一重要的水资源监测数据集,从而开展相关的研究和决策支持工作。要使用Google Earth Engine下载JRC全球水体数据,首先需要在Google Earth Engine平台上进行注册和登录。JRC全球水体数据是由欧洲联合研究中心开发的高分辨率全球水体分类数据集,覆盖了整个地球的陆地和水域。下载完成后,你可以使用各种遥感数据处理软件来打开和分析这些数据,以满足不同的研究和应用需求。

LrlDebug的博客 1160

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

我们将顶点着色器里的正弦值和余弦值暴露给js,便可以用js旋转图形了。radians(float degree) 将角度转弧度。sin(float angle) 正弦。cos(float angle) 余弦。在js 中修改uniform 变量。// 修改uniform 变量。可以直接在着色器里写旋转公式。// 获取Uniform变量。

Wang的专栏 753

ICC2: place阶段的clock network delay

设置了set_clock_latency之后,即便没长tree,也会有反标值,显示为clock network delay(ideal)和设置的clock latency值,需要注意的是同时设置set_clock_latency和set_clock_latency -source,clock network delay(ideal)值是二者叠加的。我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧?

m0_61544122的博客 317

带有HSE组件的S32系列芯片中各子系统如何依次启动?

仔细阐述了上电后各个子系统的启动顺序,并给出了详细的启动步骤流程图。

车载系统攻城狮 1704

Threejs/WebGL中旋转变换的原理

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

求上得中,求中得下 1214

AutoSAR_BSW高阶 7. Signal Group 信号组

Autosar BSW的高级配置是实现复杂汽车电子系统的关键步骤之一。通过合理配置信号组和使用适当的参数,您可以提高系统性能,确保数据的可靠传输。在本博客中,我们深入探讨了信号组的概念和高级配置参数,并提供了示例代码,希望这些信息能够帮助您更好地理解和应用Autosar BSW的高级配置。如果您在配置过程中遇到任何问题,不妨寻求专业支持,以确保您的汽车电子系统能够顺利运行。Autosar COM 模块是一个广泛应用于汽车行业的关键技术,它使不同的电子控制单元能够有效地通信和协作。

一直在水些技术小文 663

WebGl 旋转矩阵

旋转矩阵是一个正交矩阵,用于在二维或三维空间中描述一个坐标系绕原点的旋转。在三维空间中,旋转矩阵通常用于沿x轴、y轴或z轴进行旋转,或者沿任意给定轴线进行旋转。旋转矩阵具有一些重要性质,例如它们是正交的,即它们的共轭转置等于其逆矩阵,而且它们保持向量的长度和夹角不变。

dlmyrt的博客 645

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

7.移动旋转和缩放(矩阵)

1.逆时针(正旋转):如果旋转角是正值,观察者在Z轴正半轴某处,视线沿着Z轴负方向进行观察,那么看到的物体是逆时针方向旋转的。 2.右手法则旋转:右手握拳,大拇指伸直并使其指向旋转轴的正方向,那么右手其余手指就指明了旋转的方向。 3.平移矩阵: 如图:x' = x + Tx ; y' = y + Ty ; z' = z + Tz; 则平移矩阵就是: 4.旋转矩阵: 在二维平面中,x' = x * cosB - y * sinB ; y' = y * sinB + y * cosB ;

j_oop的博客 4176

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

WebGL 3D变换:从基础数学到矩阵运算

3D图形编程中的变换操作是构建虚拟世界的基石,其核心原理是通过数学运算改变顶点坐标位置。平移、旋转和缩放这三种基础变换,本质上分别对应坐标值的加法、三角函数运算和乘法操作。理解这些底层原理有助于开发者更直观地掌握WebGL等图形API的运作机制。在工程实践中,直接计算顶点坐标虽然直观,但面对复杂场景时,矩阵运算因其统一格式和GPU友好特性成为行业标准解决方案。通过gl-matrix等库实现矩阵变换,不仅能简化代码结构,还能显著提升渲染性能。对于WebGL开发者而言,从基础数学过渡到矩阵运算,是掌握3D图形编

weixin_33743248的博客 485

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

上一篇: WebGL笔记:图形缩放的原理和实现
下一篇: WebGL笔记:矩阵平移的数学原理和实现
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、付费专栏及课程。

余额充值