webgl投影矩阵推导(正射投影、透视投影)

这篇具有很好参考价值的文章主要介绍了webgl投影矩阵推导(正射投影、透视投影)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


前言

在webgl中,三维空间中的所有物体不是会都被绘制出来,只有当它在可视范围内时,才会进行绘制。因为不在可视范围中的物体即使绘制也不会在屏幕上显示。除了水平和垂直范围内的限制,WebGL还限制观察者的可视深度,即"能够看多远"。水平视角、垂直视角、可视深度,三者定义了可视空间。常用的可线空间分为两种:

  • 正射投影(orthographic projection)产生的长方体状可视空间
  • 透视投影(perspective projection)产生的锥体状可视空间

正射投影

经过正射投影后,场景中的物体大小尺寸都不会改变,即物体大小与其所在的位置没有关系,如下图所示:物体投影线与投影面保持垂直

webgl投影矩阵,WebGL,矩阵,webgl,线性代数

正射投影的可视空间如下。其中前后两个面分别称近裁剪面远裁剪面,处于可视空间外的物体不会被渲染到屏幕上。

webgl投影矩阵,WebGL,矩阵,webgl,线性代数

正射投影要做的事情就是将可视空间的坐标转换至 [-1, 1]的立方体空间中。下面我们来进行正射投影矩阵的推导,假设进行投影转换前坐标为(x,y,z),正射投影转换后坐标为(x‘,y’,z‘),left、right、top、bottom分别简写为l、r、t、b,近裁剪面near和原裁剪面far分别简写为n,f:

  • x => x’
    webgl投影矩阵,WebGL,矩阵,webgl,线性代数

  • y => y’

webgl投影矩阵,WebGL,矩阵,webgl,线性代数

  • z => z’

webgl投影矩阵,WebGL,矩阵,webgl,线性代数

由于z方向实际是指向屏幕内的(左手坐标系),因此最终的表达式为z的系数需要乘以-1

将投影矩阵转换为表达式形式:
webgl投影矩阵,WebGL,矩阵,webgl,线性代数
webgl投影矩阵,WebGL,矩阵,webgl,线性代数
将:

  • x’ = 2x / (r-l) - (r+l) / r-l
  • y’ = 2y / (t-b) - (t+b) / t-b
  • z’ = -2z / (f-n) - (f+n) / f-n
  • w’ = 1

代入得正射投影矩阵👇
webgl投影矩阵,WebGL,矩阵,webgl,线性代数

透视投影

与正射投影不同,透视投影符合人眼的实际效果:物体的形状与物体所处的位置有关,近处的物体大、远处的东西小,这样效果赋予了照片深度感,或称透视感

如下图所示,由于近裁剪面的存在,透视投影实际是一个被裁切了一块的锥体,也就是一个梯状空间。

webgl投影矩阵,WebGL,矩阵,webgl,线性代数

透视投影变换矩阵分为两步:首先,将锥体空间转换到矩形空间,这里参考了这篇文章:链接。之后,按照正射投影原则将其投影至[-1,1]的立方空间内

  • 锥体空间 => 长方体空间

webgl投影矩阵,WebGL,矩阵,webgl,线性代数

现在我们的目的是将锥体空间内坐标为(x,y,z)的 P 投影至由红色近平面构成的长方体可视空间中,图中的 P‘ 为在长方体空间中的坐标(x’, y’, z’)

首先考虑 x 和 y坐标:
webgl投影矩阵,WebGL,矩阵,webgl,线性代数
上图为从x轴方向看向yz平面,很容易由相似三角形得:

webgl投影矩阵,WebGL,矩阵,webgl,线性代数
也就是说
webgl投影矩阵,WebGL,矩阵,webgl,线性代数
-代表第三行未知,接下来是关键的一步,按照webgl中齐次坐标的概念(x,y,z,1)与(kx,ky,kz,k)是等价的

将上个式子的右侧增加一项1,则:
webgl投影矩阵,WebGL,矩阵,webgl,线性代数
转化为矩阵运算的形式就是:

webgl投影矩阵,WebGL,矩阵,webgl,线性代数

只观察第三行:假设它们系数为a b c d

  • 当P’位于远平面,上式中右侧x y 的系数为 f:ax + by -cf +d = f * f
  • 当P’位于近平面(上式):ax + by -cn +d = n * n

可得 a = b = 0, c= n+f, d=nf,推导证明新的z坐标的值与其原x y 坐标没有关系,梯形空间转向长方体空间的转换矩阵为:

webgl投影矩阵,WebGL,矩阵,webgl,线性代数

  • 透视投影矩阵

在进行一次正射投影即可得最终的透视矩阵

webgl投影矩阵,WebGL,矩阵,webgl,线性代数
结果为👇

webgl投影矩阵,WebGL,矩阵,webgl,线性代数

由于透视投影中没有直接给出top、bottom、left、right,因此需要使用视角α和宽高比aspect表示:

  • t = n * tan(α/2)
  • b = -t
  • r = n * aspect * tan(α/2)
  • l = -r

最终的正射投影矩阵👇
webgl投影矩阵,WebGL,矩阵,webgl,线性代数

总结

  • 正射投影矩阵

webgl投影矩阵,WebGL,矩阵,webgl,线性代数文章来源地址https://www.toymoban.com/news/detail-788281.html

  • 透视投影矩阵
    webgl投影矩阵,WebGL,矩阵,webgl,线性代数

到了这里,关于webgl投影矩阵推导(正射投影、透视投影)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • WebGL 视图矩阵、模型视图矩阵

    目录 立方体由三角形构成 视点和视线 视点、观察目标点和上方向 视点: 观察目标点

    2024年02月09日
    浏览(39)
  • 线性代数拾遗(6)—— 向量空间投影与投影矩阵

    参考:麻省理工线性代数 阅读本文前请先了解矩阵四个基本子空间,参考:线性代数拾遗(5) —— 矩阵的四个基本子空间 考察二维平面投影,如下将向量 b pmb{b} b 投影到向量 a pmb{a} a 方向,得到 a pmb{a} a 的子空间中的向量 p pmb{p} p ,假设是 a pmb{a} a 的 x x x 倍 如图可见

    2024年02月07日
    浏览(55)
  • webgl-图形非矩阵旋转

    知识拓展 由(x1,y1)旋转β角度到(x2,y2) 根据圆极坐标方程 x1 = r*cosα y1 = r*sinα 可得 x2 =r*cos(α + β)= r*cosα*cosβ - r*sinα*sinβ,因为x1 = r*cosα,y1 = r*sinα,所以x2 = x1*cosβ -y1*sinβ y2 = r*sin(α + β) = r*sinα*cosβ + r*cosα*sinβ,因为x1 = r*cosα,y1 = r*sinα,所以y2 = y1* cosβ + x1*sinβ 因此 (

    2024年02月01日
    浏览(40)
  • WebGL矩阵变换库

    目录 矩阵变换库: Matrix4对象所支持的方法和属性如表所示: 方法属性规范:  虽然平移、旋转、缩放等变换操作都可以用一个4×4的矩阵表示,但是在写WebGL程序的时候,手动计算每个矩阵很耗费时间。为了简化编程,大多数We

    2024年02月11日
    浏览(38)
  • WebGL矩阵变换

    目录 变换矩阵:旋转 变换矩阵:平移 4×4的旋转矩阵  示例代码:

    2024年02月11日
    浏览(37)
  • GAMES101投影矩阵推导详解和分析

    之前推导过OpenGL的投影矩阵,学了GAMES101之后,发现老师的推导方式很有意思,且GAMES101的坐标系约定和OpenGL不一样。最近在填新坑URasterizer的过程中,发现了一些问题,比如透视投影在clip space做裁剪时为啥w必须取反,以及之前GAMES101作业中做深度测试时为啥z值要取反的问题

    2024年02月08日
    浏览(46)
  • webgl-矩阵、旋转、平移、缩放 glMatrix组件

    引入新组建glMatrix glMatrix.js /*! @fileoverview gl-matrix - High performance matrix and vector operations @author Brandon Jones @author Colin MacKenzie IV @version 3.4.3 Copyright (c) 2015-2021, Brandon Jones, Colin MacKenzie IV. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation f

    2024年02月10日
    浏览(48)
  • WebGL笔记:矩阵的变换之平移的实现

    矩阵的变换 变换 变换有三种状态: 平移 、 旋转 、 缩放 。 当我们变换一个图形时,实际上就是在移动这个图形的所有顶点。 解释 webgl 要绘图的话,它是先定顶点的,就比如说我要画个三角形,那它会先把这三角形的三个顶点定出来。 然后它再考虑以什么样的方式去绘制

    2024年02月04日
    浏览(44)
  • 一起学 WebGL:感受三维世界之视图矩阵

    大家好,我是前端西瓜哥。之前绘制的图形都是在 XY 轴所在的平面上,这次我们来加入一点深度信息 z,带你走入三维的世界。 对于一个立方体来说,我们从它的正前方看,不管距离它多远,也只能看到一个二维的正方形。因此我们需要引入 视图矩阵 (view matrix)。它的作

    2024年02月16日
    浏览(52)
  • 线性代数|推导:线性变换与在基下的矩阵一一对应

    前置定义 1 设 T T T 是线性空间 V n V_n V n ​ 中的线性变换,在 V n V_n V n ​ 中取定一个基 α 1 , α 2 , ⋯   , α n boldsymbol{alpha}_1,boldsymbol{alpha}_2,cdots,boldsymbol{alpha}_n α 1 ​ , α 2 ​ , ⋯ , α n ​ ,如果这个基在变换 T T T 下的像(用这个基线性表示)为 { T ( α 1 ) = a 11 α 1 +

    2024年02月04日
    浏览(58)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包