webGL入门教程_04vec3、vec4 和齐次坐标总结
vec3、vec4 和齐次坐标总结
1. vec3 和 vec4
1.1 什么是 vec3 和 vec4?
- vec3:
- GLSL 中的三维向量类型,包含 3 个浮点数:
(x, y, z)。 - 常用于表示三维坐标、RGB 颜色、法线、方向等。
- GLSL 中的三维向量类型,包含 3 个浮点数:
- vec4:
- GLSL 中的四维向量类型,包含 4 个浮点数:
(x, y, z, w)。 - 在三维空间中扩展了一个
w分量,常用于齐次坐标或 RGBA 颜色。
- GLSL 中的四维向量类型,包含 4 个浮点数:
1.2 vec3 和 vec4 的常见用途
| 用途 | vec3 | vec4 |
|---|---|---|
| 位置坐标 | 用于描述 3D 空间中的点 (x, y, z) | 齐次坐标 (x, y, z, w)(用于投影变换) |
| 颜色表示 | 描述 RGB 颜色 (r, g, b) | 描述 RGBA 颜色 (r, g, b, a)(带透明度) |
| 法线与方向 | 表示法线向量或方向向量 (nx, ny, nz) | 较少用于法线,可能用于特殊数学场景 |
| 纹理坐标 | 描述 3D 纹理坐标 (s, t, p) | 可扩展到 (s, t, p, q) |
| 光照计算 | 用于存储法线、光线方向、光照计算结果等 | 较少用于直接计算,通常扩展到更高维场景 |
1.3 vec3 和 vec4 的访问方式
-
分量访问:
- 使用分量名:
- 位置表示:
x, y, z, w - 颜色表示:
r, g, b, a - 纹理坐标:
s, t, p, q
- 位置表示:
- 示例:
vec3 position = vec3(1.0, 2.0, 3.0); float x = position.x; // 1.0 float g = position.g; // 2.0 (等价于 y)
- 使用分量名:
-
下标访问:
- 通过
[0],[1],[2]访问分量。 - 示例:
vec4 color = vec4(1.0, 0.5, 0.2, 0.8); float alpha = color[3]; // 0.8
- 通过
-
分量重组(Swizzling):
- 支持重新排列分量或构造新的向量。
- 示例:
vec3 position = vec3(1.0, 2.0, 3.0); vec2 xy = position.xy; // (1.0, 2.0) vec4 rgba = vec4(position, 1.0); // (1.0, 2.0, 3.0, 1.0)
1.4 vec3 和 vec4 的底层实现
- 内存存储:
vec3和vec4是连续存储的浮点数,分别占用 3 和 4 个浮点数的存储空间。
- 无固定语义:
- 它们只是浮点数的容器,含义由程序上下文决定。
- 例如,
vec3可以表示位置(x, y, z),也可以表示颜色(r, g, b)。
2. 齐次坐标(Homogeneous Coordinates)
2.1 什么是齐次坐标?
齐次坐标是笛卡尔坐标的扩展形式,通过增加一个额外的维度 w,使坐标表示为:
- 二维齐次坐标:
(x, y, w) - 三维齐次坐标:
(x, y, z, w)
当 w ≠ 0 w \neq 0 w=0 时,可以还原为笛卡尔坐标:
{ x ′ = x w y ′ = y w z ′ = z w \begin{cases} x' = \frac{x}{w} \\ y' = \frac{y}{w} \\ z' = \frac{z}{w} \end{cases} ⎩ ⎨ ⎧x′=wxy′=wyz′=wz
当 w = 1 w = 1 w=1 时,齐次坐标与笛卡尔坐标一致。
2.2 为什么需要齐次坐标?
-
统一几何变换:
- 在笛卡尔坐标中,平移无法通过矩阵乘法实现。
- 在齐次坐标中,所有变换(平移、旋转、缩放、投影)都可以通过矩阵乘法实现。
-
透视投影:
- 齐次坐标的 w w w 分量用于描述透视投影的深度缩放关系。
- 投影变换后需要归一化处理,结果由 ( x / w , y / w , z / w ) (x/w, y/w, z/w) (x/w,y/w,z/w) 确定。
-
表示无穷远点:
- 当 w = 0 w = 0 w=0 时,齐次坐标表示无穷远点,可用于方向向量表示。
2.3 数学特性
-
从笛卡尔坐标到齐次坐标:
( x , y , z ) → ( x , y , z , 1 ) (x, y, z) \rightarrow (x, y, z, 1) (x,y,z)→(x,y,z,1) -
从齐次坐标到笛卡尔坐标:
( x , y , z , w ) → ( x w , y w , z w ) (x, y, z, w) \rightarrow \left( \frac{x}{w}, \frac{y}{w}, \frac{z}{w} \right) (x,y,z,w)→(wx,wy,wz) -
齐次坐标变换示例(平移):
笛卡尔坐标的平移:
( x ′ , y ′ , z ′ ) = ( x + t x , y + t y , z + t z ) (x', y', z') = (x + tx, y + ty, z + tz) (x′,y′,z′)=(x+tx,y+ty,z+tz)齐次坐标的平移:
[ x ′ y ′ z ′ 1 ] = [ 1 0 0 t x 0 1 0 t y 0 0 1 t z 0 0 0 1 ] [ x y z 1 ] \begin{bmatrix} x' \\ y' \\ z' \\ 1 \end{bmatrix} = \begin{bmatrix} 1 & 0 & 0 & tx \\ 0 & 1 & 0 & ty \\ 0 & 0 & 1 & tz \\ 0 & 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} x \\ y \\ z \\ 1 \end{bmatrix} x′y′z′1 = 100001000010txtytz1 xyz1
2.4 齐次坐标的应用
-
几何变换:
- 统一表示平移、旋转、缩放和投影变换。
-
透视投影:
- 处理近大远小的效果,将 3D 场景投影到 2D 平面。
-
无穷远点:
- 描述方向向量(如光线方向、法线等),表示为 ( x , y , z , 0 ) (x, y, z, 0) (x,y,z,0)。
2.5 示例:齐次坐标在图形学中的使用
-
平移变换:
点 ( 1 , 2 , 3 ) (1, 2, 3) (1,2,3) 平移 ( 1 , 1 , 1 ) (1, 1, 1) (1,1,1):
齐次坐标计算:
[ x ′ , y ′ , z ′ , 1 ] = [ 1 2 3 1 ] × [ 1 0 0 1 0 1 0 1 0 0 1 1 0 0 0 1 ] [x', y', z', 1] = \begin{bmatrix} 1 & 2 & 3 & 1 \end{bmatrix} \times \begin{bmatrix} 1 & 0 & 0 & 1 \\ 0 & 1 & 0 & 1 \\ 0 & 0 & 1 & 1 \\ 0 & 0 & 0 & 1 \end{bmatrix} [x′,y′,z′,1]=[1231]× 1000010000101111 结果: [ 2 , 3 , 4 , 1 ] [2, 3, 4, 1] [2,3,4,1]
-
透视投影:
投影点 ( 2 , 4 , 6 ) (2, 4, 6) (2,4,6) 到二维平面:投影矩阵:
[ 1 0 0 0 0 1 0 0 0 0 1 − 1 / d 0 0 0 1 ] \begin{bmatrix} 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 1 & -1/d \\ 0 & 0 & 0 & 1 \end{bmatrix} 10000100001000−1/d1
相关文章:
webGL入门教程_04vec3、vec4 和齐次坐标总结
vec3、vec4 和齐次坐标总结 1. vec3 和 vec4 1.1 什么是 vec3 和 vec4? vec3: GLSL 中的三维向量类型,包含 3 个浮点数:(x, y, z)。常用于表示三维坐标、RGB 颜色、法线、方向等。 vec4: GLSL 中的四维向量类型&…...
uniapp中父组件数组更新后与页面渲染数组不一致实战记录
简单描述一下业务场景方便理解: 商品设置功能,支持添加多组商品(点击添加按钮进行增加).可以对任意商品进行删除(点击减少按钮对选中的商品设置进行删除). 问题: 正常添加操作后,对已添加的任意商品删除后,控制台打印数组正常.但是与页面显示不一致.已上图为例,选中尾…...
优化 Conda 下载速度:详细的代理配置和网络管理策略
优化 Conda 下载速度:详细的代理配置和网络管理策略 为了彻底解决使用 Conda 下载 PyTorch 时遇到的速度问题,并确保下载过程稳定可靠,这需要一个详细、综合的技术方案。让我们更深入地分析问题原因,然后详尽地解释采取的解决策略…...
服务器遭受DDoS攻击后如何恢复运行?
当服务器遭受 DDoS(分布式拒绝服务)攻击 后,恢复运行需要快速采取应急措施来缓解攻击影响,并在恢复后加强防护以减少未来攻击的风险。以下是详细的分步指南: 一、应急处理步骤 1. 确认服务器是否正在遭受 DDoS 攻击 …...
MFC音视频播放器-支持电子放大等功能
前言 本播放器在VS2019下开发,使用ffmpegD3D实现视频播放渲染功能。同时本播放器支持录像功能、截图功能、音视频播放功能、码流信息显示、电子放大功能等。D3D的渲染同时支持surface和texture两种方式,电子放大功能是在D3D Texture方式下进行实现。以下…...
c语言编程1.17蓝桥杯历届试题-回文数字
题目描述 观察数字:12321,123321 都有一个共同的特征,无论从左到右读还是从右向左读,都是相同的。这样的数字叫做:回文数字。 本题要求你找到一些5位或6位的十进制数字。满足如下要求: 该数字的各个数位之…...
el-table 纵向 横向 多级表头
<el-table :data"tableData" class"diaTable":span-method"handleSpanMethod"border:header-cell-style"{background:#292929,color:#fff}"><!-- 纵向表头 --><el-table-column label"纵向表头" width"…...
uniapp开发微信小程序笔记8-uniapp使用vant框架
前言:其实用uni-app开发微信小程序的首选不应该是vant,因为vant没有专门给uni-app设置专栏,可以看到目前Vant 官方提供了 Vue 2 版本、Vue 3 版本和微信小程序版本,并由社区团队维护 React 版本和支付宝小程序版本。 但是vant的优…...
分布式项目使用Redis实现数据库对象自增主键ID
hello。大家好,我是灰小猿,一个超会写bug的程序猿! 在分布式项目中,数据表的主键ID一般可能存在于UUID或自增ID这两种形式,UUID好理解而且实现起来也最容易,但是缺点就是数据表中的主键ID是32位的字符串&a…...
npm-运行项目报错:A complete log of this run can be found .......npm-cache_logs\
1.问题 没有找到对应的某种依赖,node_modules出现问题。 2.解决 (1)查看对应依赖是否引入或者是由于合并分支错误 引入js或依赖不存在。谨慎删除依赖包 (2)查找对应引入依赖进行安装最后解决方法-删除依赖包清除缓存 npm cache clean --force (2)重新向同事引入…...
SolarCube: 高分辨率太阳辐照预测基准数据集
太阳能作为清洁能源在减缓气候变化中的作用日益凸显,其稳定的供应对电网管理至关重要。然而,太阳辐照受云层和天气变化的影响波动较大,给光伏电力的管理带来挑战,尤其是在调度、储能和备用系统管理方面。因此,精确的太…...
华为小米苹果三星移动设备访问windows共享文件夹windows11
如果移动设备和windows电脑都在同一个局域网内,可以用移动设备访问windows11的共享文件夹 1、设置共享文件夹 2、添加everyone用户即可 3、查看ip地址 4、在华为手机上点击文件管理,里面有个网上邻居 5、正常情况下,华为手机会扫描到同一局域…...
网络安全三防指南:只防病毒不安全
5月17日,瑞星全球反病毒监测网截获一个恶性病毒,由于该病毒的破坏能力和当年著名的CIH病毒几乎完全一样,因此瑞星将该病毒命名为“新CIH”病毒。被“新CIH”感染的电脑,主板和硬盘数据将被破坏,致使电脑无法启动&#…...
论文概览 |《Urban Analytics and City Science》2023.05 Vol.50 Issue.4
本次给大家整理的是《Environment and Planning B: Urban Analytics and City Science》杂志2023年5月第50卷第4期的论文的题目和摘要,一共包括19篇SCI论文! 论文1 Data analytics and sustainable urban development in global cities 全球城市的数据…...
【ROS2】ROS2 C++版本 与 Python版本比较
ROS 系列学习教程(总目录) ROS2 系列学习教程(总目录) 目录 一、功能包的构建方式二、功能包组织结构三、代码编写四、性能与效率五、兼容性六、应用场景 目前ROS开发主要使用 C 和 Python 语言,这里会分别实现并讲解。 相较于ROS1,ROS2的 C 和 Python …...
物联网射频识别和RFID开发(一):RFID基础—概念、应用
一、RFID的发展历史 二、RFID与物联网 (一)物联网与RFID的关系 物联网的基本思想是美国麻省理工学院在1999年提出的,其核心思想是为全球每个物品提供唯一的电子标识符。这种电子标识符就是现在经常提到的“电子产品编码(Electronic Product …...
JVM:即时编译器,C2 Compiler,堆外内存排查
1,即时编译器 1.1,基本概念 常见的编译型语言如C,通常会把代码直接编译成CPU所能理解的机器码来运行。而Java为了实现“一次编译,处处运行”的特性,把编译的过程分成两部分,首先它会先由javac编译成通用的…...
webpack5 的五大核心配置(二)
webpack主要构成部分: entry 入口output 出口loaders 转化器plugins 插件mode 模式devServer 开发服务器 webpack.config.js 配置文件基本格式 module.exports{//入口文件entry:{},//出口文件output:{},//module rules loadersmodule{};//插件plugins:[],//开发…...
【查询基础】.NET开源 ORM 框架 SqlSugar 系列
.NET开源 ORM 框架 SqlSugar 系列 【开篇】.NET开源 ORM 框架 SqlSugar 系列【入门必看】.NET开源 ORM 框架 SqlSugar 系列【实体配置】.NET开源 ORM 框架 SqlSugar 系列【Db First】.NET开源 ORM 框架 SqlSugar 系列【Code First】.NET开源 ORM 框架 SqlSugar 系列【数据事务…...
git push使用
推送指定分支 将当前分支推送远程 git push origin HEAD:<branch-name> 这里的 HEAD 是一个特殊的指针,它指向当前分支的最新提交。这条命令会将当前分支的更改推送到远程的 master 分支。 示例 git push origin HEAD:main 当前分支是test,远…...
Rusted PackFile Manager (RPFM):全面战争模组制作的终极利器
Rusted PackFile Manager (RPFM):全面战争模组制作的终极利器 【免费下载链接】rpfm Rusted PackFile Manager (RPFM) is a... reimplementation in Rust and Qt6 of PackFile Manager (PFM), one of the best modding tools for Total War Games. 项目地址: http…...
图像处理核心技术:分辨率、信噪比与形态学算法解析
1. 图像处理基础概念解析在数字图像处理领域,我们经常需要面对几个核心问题:如何量化系统的分辨能力?如何评估图像质量?如何从噪声中提取有用信息?这些问题的答案构成了现代图像处理技术的理论基础。作为一名从业十余年…...
重新定义下载体验:ctfileGet城通网盘高速下载完整指南
重新定义下载体验:ctfileGet城通网盘高速下载完整指南 【免费下载链接】ctfileGet 获取城通网盘一次性直连地址 项目地址: https://gitcode.com/gh_mirrors/ct/ctfileGet 你是否曾经面对城通网盘几十KB/s的下载速度感到绝望?当急需一个大文件时&a…...
终极指南:3分钟免费配置PotPlayer百度翻译插件,实现实时字幕翻译
终极指南:3分钟免费配置PotPlayer百度翻译插件,实现实时字幕翻译 【免费下载链接】PotPlayer_Subtitle_Translate_Baidu PotPlayer 字幕在线翻译插件 - 百度平台 项目地址: https://gitcode.com/gh_mirrors/po/PotPlayer_Subtitle_Translate_Baidu …...
Seraphine:英雄联盟玩家的智能数据助手,三步解锁游戏信息优势
Seraphine:英雄联盟玩家的智能数据助手,三步解锁游戏信息优势 【免费下载链接】Seraphine 英雄联盟战绩查询工具 项目地址: https://gitcode.com/gh_mirrors/se/Seraphine 在英雄联盟的竞技世界中,信息就是力量。Seraphine是一款基于英…...
基于MCP协议的智能文档处理工具simdoc-mcp:从RAG原理到Claude集成实战
1. 项目概述:从“文档理解”到“智能交互”的范式跃迁最近在折腾一个挺有意思的开源项目,叫simdoc-mcp。乍一看这个名字,可能有点摸不着头脑,svd-ai-lab是背后的团队,simdoc是核心,mcp是关键协议。简单来说…...
ATE PCB组装:半导体测试中的精密工艺与挑战解析
1. ATE PCB组装:半导体测试的基石与挑战 在半导体行业,一颗芯片从设计到最终封装出厂,其性能与可靠性的验证是决定产品成败的最后一环。随着芯片工艺节点不断微缩,集成度呈指数级增长,对测试环节的要求也达到了前所未有…...
虚拟原型技术:软硬件协同开发与多核处理器调试新范式
1. 虚拟原型平台:从芯片设计到软件集成的范式转变在嵌入式系统开发领域,尤其是涉及复杂多核处理器的项目里,一个长期存在的“鸡生蛋还是蛋生鸡”的困境一直困扰着工程师们:硬件原型板(EVB)尚未就绪…...
白炽灯非线性电阻特性在电路保护与调试中的经典应用
1. 项目概述:当白炽灯不再照明作为一名在电子工程领域摸爬滚打了十几年的老工程师,我手边的“破烂”工具箱里,除了常规的电阻、电容、芯片,还常年备着几样“非主流”玩意儿:几个不同瓦数的白炽灯泡。在很多人看来&…...
OpenClaw入门教程(1)——CLI 与 UI 配置详解
# OpenClaw 核心概念详解(一):CLI 与 UI 配置 创建日期:2026-04-21 | 作者:AiToMoney团队 🐉 | 版本:v1.0 | 适用版本:OpenClaw 2026.4.14+ 📖 概述 OpenClaw 4.14 版本提供了两种配置方式:CLI(命令行) 和 UI(图形界面),相比 3.13 版本的手动编辑 JSON 文件…...
