首页 > 其他分享 >计算机图形学—NDC归一化设备坐标

计算机图形学—NDC归一化设备坐标

时间:2024-09-07 12:52:57浏览次数:14  
标签:Frustum NDC 矩阵 图形学 nx ny 坐标 归一化 压缩

NDC(Normalized Device Coordinates)即归一化设备坐标,是计算机图形学中用于表示和处理图形的一个坐标系统。NDC 的坐标范围通常是从 [−1,1][−1,1] 在 x 和 y 轴上,z 轴上则是从 0 到 1。它是在将模型空间中的三维坐标转换为屏幕空间坐标之前的一个中间步骤。

Frustum:模型的可视范围

Canonical Cube:标准正方形

目的:将frustum压缩至以远点为中心,边长为2的立方体(即为Canonical Cube)。

假设初始Frustum:x轴范围[l,r],y轴范围[b,t],z轴范围[f,n]。

正交投影

只进行平移和缩放,并不满足近大远小。需要经过两次变化,

先将Frustum平移至原点(右侧矩阵)

后将Frustum压缩为标准立方体,将边长强制转为2(左边矩阵)

写成矩阵形式为:

M:\begin{pmatrix} \frac{2}{r-l}\ 0\ 0\ 0\\ 0\ \frac{2}{t-b}\ 0\ 0\\ 0\ 0\ \frac{2}{n-f}\ 0\\ 0\ 0\ 0\ 1\ \end{pmatrix}  \begin{pmatrix} 1\ 0\ 0\ -\frac{r+l}{2}\\ 0\ 1\ 0\ -\frac{t+b}{2}\\ 0\ 0\ 1\ -\frac{n+f}{2}\\ 0\ 0\ 0\ 1\ \end{pmatrix}

透视投影

符合近大远小的视觉效果,主要利用相似三角形的等比变换。

Frustum:前面小,后面大的横向放置的四棱台。

思路:将Frustum压缩为长方体,然后做正交投影。

对于Frustum中任意深度点的x,y的坐标为\frac{n}{z}x\frac{n}{z}y(n为Frustum的z轴上的最近端,z为任意深度点的z坐标)

可以认为(x,y,z,1)表示的点经过压缩之后,变为(nx/z,ny/z,unknown,1),

同时×z可得(nx,ny,unknow,z),那么可以推算代表压缩的矩阵:

\begin{pmatrix} n\ 0\ 0\ 0\ \\ 0\ n\ 0\ 0\\\ ?\ ?\ ?\ ?\\\ 0\ 0\ 1\ 0\ \end{pmatrix}

对于近平面上的点,z坐标不变所以

(x,y,n,1)——>(nx,ny,n方,n)

所以第三行应为(0,0,A,B)型,且An+B = n方

对于远平面的中心点,z坐标也并不会发生改变

(0,0,f,1)——>(0,0,f方,f),所以Af +B = f方

A=n+f,B=-nf

可以得出代表压缩的矩阵:

\begin{pmatrix} n\ 0\ 0\ 0\ \\ 0\ n\ 0\ 0\\\ 0\ 0\ n+f\ nf\\\ 0\ 0\ 1\ 0\ \end{pmatrix}

标签:Frustum,NDC,矩阵,图形学,nx,ny,坐标,归一化,压缩
From: https://blog.csdn.net/2303_76262050/article/details/141959468

相关文章

  • 图形学系列教程,带你从零开始入门图形学(包含配套代码)—— 你的第一个三角形
    图形学系列文章目录序章初探图形编程第1章你的第一个三角形第2章变换顶点变换视图矩阵&帧速率第3章纹理映射第4章透明度和深度第5章裁剪区域和模板缓冲区第6章场景图第7章场景管理第8章索引缓冲区第9章骨骼动画第10章后处理第11章实时光照(一)第12章实时光照(二)第1......
  • 图形学系列教程,带你从零开始入门图形学(包含配套代码)—— 顶点变换
    图形学系列文章目录序章初探图形编程第1章你的第一个三角形第2章变换顶点变换视图矩阵&帧速率第3章纹理映射第4章透明度和深度第5章裁剪区域和模板缓冲区第6章场景图第7章场景管理第8章索引缓冲区第9章骨骼动画第10章后处理第11章实时光照(一)第12章实时光照(二)第1......
  • 图形学系列教程,带你从零开始入门图形学(包含配套代码)—— 初探图形编程
    图形学系列文章目录序章初探图形编程第1章你的第一个三角形第2章变换顶点变换视图矩阵&帧速率第3章纹理映射第4章透明度和深度第5章裁剪区域和模板缓冲区第6章场景图第7章场景管理第8章索引缓冲区第9章骨骼动画第10章后处理第11章实时光照(一)第12章实时光照(二)第1......
  • tailwindcss学习:1. vue项目配置 tailwindcss
    官网的配置是需要一个cli去生成一份CSS,我简单总结一下更加干货的配置办法:1.pnpmipostcssautoprefixertypescript2.配置postcss.config.cjsmodule.exports={plugins:{tailwindcss:{},autoprefixer:{},},};3.执行npxtailwindcssinit4.项目的sr......
  • 图形学学习(二):Shader输入输出及自制Shader类
    在LearnOpengl学了Shader的输入输出和自制Shader类,输入输出还是好理解的,自制Shader类的讲解我感觉还是用代码更直观一些(个人感觉),这两天看了一下秋招的面试面经,想了想明年找工作的问题,刺激,十分感慨,优秀的人还是太多了,不过最重要的还是得做好自己!!!Shader的输入输出总结有两种......
  • 图形学系列教程,带你从零开始入门图形学(包含配套代码)—— 你的第一个三角形
    图形学系列文章目录序章初探图形编程第1章你的第一个三角形第2章视图矩阵第3章顶点变换第4章纹理映射第5章透明度和深度第6章裁剪区域和模板缓冲区第7章场景图第8章场景管理第9章索引缓冲区第10章骨骼动画第11章后处理第12章实时光照(一)第13章实......
  • OpenCV(cv::findContours())
    目录1.函数定义2.示例3.常见应用4.注意事项cv::findContours()是OpenCV中用于检测图像中的轮廓的函数。1.函数定义voidfindContours(InputOutputArrayimage,OutputArrayOfArrayscontours,OutputArrayhierarchy,intmode,intmethod......
  • Python中,使用`sklearn.preprocessing`模块中的`StandardScaler`或`MinMaxScaler`可以
    在Python中,使用`sklearn.preprocessing`模块中的`StandardScaler`或`MinMaxScaler`可以对数据进行标准化或归一化处理。以下是如何对一个列表(list)中的数据进行标准化的示例:第一结合numpy###使用StandardScaler进行标准化(Z-scorenormalization)`StandardScaler`将数据转换为均值......
  • OpenCV(cv::findChessboardCorners())
    目录1.函数原型2.使用场景3.工作原理4.示例4.1角点精细化4.2附加标志5.注意事项cv::findChessboardCorners()是OpenCV提供的一个函数,常用于计算机视觉中的棋盘图像角点检测,特别是相机标定(calibration)和三维重建相关的任务中。1.函数原型boolcv::findChessboard......
  • GEE 更新和优化:利用GEE在线处理1985-2024年NDVI、EVI、SAVI、NDMI等指数归一化教程!(Lan
    简介本次的归一化教程,优化了数据去云,预处理等过程,同事将landsat5/7/8集合分别进行了数据整合,也就是原始波段的处理,从而我们可以调用1985-至今任何一个时期的影像进行归一化处理。具体的原文介绍请看原始的博客原始博客利用GEE(GoogleEarthEngine)在线处理NDVI、EVI、SAVI......