JavaScript WebGL 三维相关概念

2023-11-15

引子

JavaScript WebGL 矩阵之后,发现在实现三维效果之前还有一些概念需要理解,就去查了下资料,按照自己的习惯整合了一下。

齐次坐标

三维坐标理论上三个分量就够了,但在看相关程序的时候,发现会出现 4 个分量,这种表示方式称为齐次坐标,它将一个原本 n 维向量用一个 n+1 维向量表示。比如向量 (x, y, z) 的齐次坐标可表示为 (x, y, z, w)。这样表示有利于使用矩阵运算将一个点集从一个坐标系转换到另一个坐标系。齐次坐标 (x, y, z, w) 等价于三维坐标 (x/w, y/w, z/w) 。更详细介绍见这里

空间转换

WeGL 没有现成 API 可以直接绘制出三维效果,需要进行一系列空间转换,最终在二维空间(比如电脑屏幕)显示,从视觉上看上去是三维立体效果。下面看看几个主要转换过程。

模型空间

模型空间是描述三维物体自身的空间,拥有自己的坐标系和对应原点。这里点坐标可以按照 WebGL 中可见范围 [-1, +1] 约束进行描述,也可以不按照这个约束。自定义描述规则后面需要转换一下。

世界空间

物体模型创建好后,放在具体环境当中,才会达到想要的效果,除此之外,还可能会进行位移、缩放和旋转,进行这些变化都需要一个新参考坐标系,这个所处环境就是世界空间。有了世界坐标系,相互独立的物体才会有相对位置的描述。

从模型空间转换到世界空间,需要用到模型矩阵(Model Matrix)

三维模型矩阵跟 JavaScript WebGL 矩阵中介绍的二维变换矩阵类似,主要变化是行列增加和旋转。

点击展开代码

const m4 = {
   
  translation: (x, y, z) => {
   
    return [
      1, 0, 0, 0,
      0, 1, 0, 0,
      0, 0, 1, 0,
      x, y, z, 1,
    ];
  },
  // 缩放矩阵
  scaling: (x, y, z) => {
   
    return [
      x, 0, 0, 0,
      0, y, 0, 0,
      0, 0, z, 0,
      0, 0, 0, 1,
    ];
  },
  // 旋转矩阵
  xRotation: (angle) => {
   
    const c = Math.cos(angle);
    const s = Math.sin(angle);
    return [
      1,  0,  0,  0,
      0,  c,  s,  0,
      0, -s,  c,  0,
      
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JavaScript WebGL 三维相关概念 的相关文章

  • 如何清除ember js中的表单数据

    嗨 我对 ember js 很陌生 我写了一个新员工入职表格 并通过路线发送数据 数据保存成功 但问题是提交表单后我的表单数据没有清除 代码如下 app js App Router map function this resource sa
  • 解决方案:动态加载独立编译的 Webpack 2 包 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我想分享如何捆绑一个充当插件主机以及它如何加载已安装的插件动态地 应用程序和插件都与 Webpack 捆绑在一起 应用程序和插件被编译和分
  • 在网页上写乐谱[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我希望能够在网页中编写乐谱和和弦 有没有可用的库 例如用于数学的 Mathjax 如果没有 那么还有其
  • 检查复选框是否被选中? [复制]

    这个问题在这里已经有答案了 如何通过 jQuery 检查复选框是否被选中 我可以只向元素添加 ID 或类并执行此操作吗 if element val 1 do stuff if element is checked checkbox is
  • jQuery 无法在外部 JavaScript 中工作

    我是 jQuery 新手 遇到了一些奇怪的问题 我正在使用 jQuery 的change and click方法 在我的 HTML 文件中使用时它们工作正常
  • javascript - 动态变量

    您好 我正在尝试创建动态变量 但它说 变量 v0 到 v5 未定义 td each function i eval var v i this html 任何帮助将不胜感激 这听起来是个坏主意 你有什么理由不能这样做吗 var tdHtml
  • 定时器内嵌套异步等待 - 不返回所需的值

    我必须使用 Mocha 和 chai 测试来测试端点的响应 下面是相同的代码 async function getData userId let response let interval setInterval async gt resp
  • Ng Bootstrap 日期范围选择器 [markDisabled] 不适用于输入

    我正在尝试禁用某些日期ng 引导范围选择器 https ng bootstrap github io components datepicker overview 目前 我在弹出窗口中有一个范围选择器 并且我正在使用 markDisable
  • document.registerElement - 为什么我们需要指定“prototype”和“extends”?

    考虑我想扩展本地button元素 并创建我自己的super button元素 据我所知 它必须遵循以下模式 var SuperButton document registerElement super button prototype Ob
  • 无法让 CloudKit 进行身份验证(使用 Javascript 和服务器到服务器密钥)

    我正在尝试使用苹果的cloudkit js文件以建立与 CloudKit 的服务器到服务器连接 然而 尽管配置混乱了几个小时 我似乎无法让 CloudKit 认为我的请求有效 我的配置逻辑非常简单 const privateKeyFile
  • 在 JavaScript 中引用 C# 变量

    我已经阅读了很多线程 但我不明白为什么这不起作用 我正在创建一个将用作导航栏的 SharePoint Web 部件 一切都很顺利 直到我尝试在 JS 代码中引用 C 变量 这是来自 VisualWebPart1UserControl asc
  • 如何像在浏览器中一样检索准确的 HTML

    我正在使用 Python 脚本来呈现网页并检索其 HTML 它适用于大多数页面 但对于其中一些页面 检索到的 HTML 不完整 我不太明白为什么 这是我用来废弃此页面的脚本 由于某种原因 每个产品的链接不在 HTML 中 Link http
  • 如何在没有 DOM 的情况下将 javascript 作为 node.js 脚本运行?

    https github com jasondavies d3 cloud https github com jasondavies d3 cloud是一个使用 D3 库的 javascript 文字云 这是一个交互式演示 http www
  • 如何使表格单元格的最小宽度为 3 位数字?

    如何使表格中的每个单元格的最小宽度为 3 位数字且不会更大 现在我正在硬编码min width 但我不喜欢硬编码一个值 因为我将来可能想更改字体 如果需要Javascript也没关系 table border 1 tr td 1 td td
  • 主干集合排序

    我制作了我的第一个主干应用程序 但在集合排序方面遇到了一些问题 使用这个后 var SortedFriends MyFriends sortBy function friend return friend get uid console l
  • Angular - 将焦点放在动态创建的输入字段上

    我如何将焦点添加到新创建的字段 参见到目前为止的示例 http jsfiddle net aERwc 165 http jsfiddle net aERwc 165 scope addField function console log h
  • 响应覆盖 div 下的链接

    场景是这样的 我已经构建了一个顶部导航原型 它需要在其顶部有一个覆盖 透明 PNG 图像 目前它覆盖了大约 1 3 的链接 请看下面 有什么方法可以让前 1 3 的链接做出响应 即使有一个 div div 部分覆盖它们 覆盖层不会包含任何可
  • RemoveEventListener 在 Firefox 版本 58 中不起作用

    但它在 Chrome 中有效 这是我的 UI EventBus 代码 原型 addEventListener方法是一样的 只不过remove换成了add UI EventBus removeEventListener function ob
  • 将响应式网格布局转换为 Plotly Dash

    我是一个非常活跃的 Dash 用户 我开始发现 Dash 使用中存在很多限制 并且我意识到有关如何将组件转换为 Dash 的信息 内容绝对有限 并且示例过时且非常简单 并且我对 Javascript 或 React 几乎没有任何了解 我完全
  • IE 中带有“删除”方法的 jQuery.ajax 问题

    我有一个页面 用户可以使用按钮编辑各种内容并选择触发 ajax 调用 特别是 一个操作会导致远程调用一个 url 其中包含一些数据和 放置 请求 这 因为我使用的是宁静的 Rails 后端 会触发我的更新操作 我还有一个删除按钮 它调用相同

随机推荐

  • 在字节实习8个月后,成功转正!

    大家好 这里是 NewBeeNLP 今天给大家分享一位22届学弟在字节实习8个月后成功转正的经历 他向我们展示了在字节实习的日常工作 以及转正答辩该如何准备 最后告诫学弟学妹们今年秋招会很激烈 一定要尽早投递 本文堪称大厂实习转正的教科书
  • SQLITE3 使用总结

    SQLITE3 使用总结 3 5 转 3 不使用回调查询数据库 T6 F H m2 上面介绍的 sqlite3 exec 是使用回调来执行 select 操作 还有一个方法可以直接查询而不需要回调 但是 我个人感觉还是回调好 因为代码可以更
  • 安卓手机玩游戏卡顿怎么解决_员工在上班时间玩手机怎么办?解决方案来了!...

    人性化管理不是嘴上说说而已 员工为什么上班期间看手机 你思考过吗 gt gt gt gt 第一种员工自然是工作效率很高 这种员工也是很多公司想要拥有的 如果a员工在工作期间忙的鸡飞狗跳 b员工则胜似 闲庭漫步 这足以说明两者之间的工作效率
  • 基于深度学习识别模型的缺陷检测

    一 介绍 缺陷检测被广泛使用于布匹瑕疵检测 工件表面质量检测 航空航天领域等 传统的算法对规则缺陷以及场景比较简单的场合 能够很好工作 但是对特征不明显的 形状多样 场景比较混乱的场合 则不再适用 近年来 基于深度学习的识别算法越来越成熟
  • 西班牙放大招,利用区块链技术防腐

    链客 专为开发者而生 有问必答 此文章来自区块链技术社区 未经允许拒绝转载 在过去十年来 西班牙爆发了一系列引人注目的腐败丑闻 其中以公共采购最甚 但据TI 2017年的腐败认知指数表明 西班牙下滑了8个百分点 成为欧盟排名最低的国家之一
  • windows下解决matplotib中文乱码问题

    matplotlib默认是不支持中文的 在window系统下如何设置使其可以显示中文 参考文章
  • 科目一:信息系统综合知识——4.嵌入式技术

    4 嵌入式技术 4 1 嵌入式微处理器体系结构 冯诺依曼结构 传统计算机采用 也称普林斯顿结构 该结构下的存储器将程序指令存储器和数据存储器合并在一起 计算机程序和数据共用一个存储空间 程序指令存储地址和数据存储地址指向同一存储器的不同物理
  • treectrl遍历

    树是一种十分重要的数据结构 在程序设计中 我们经常用树来组织数据 对于树的遍历也是一种常规的运算 下面提供了两个算法 前面一个只是简单的遍历了所有的结点 后面一个则可以根据传入条件返回相应的结点 功能 遍历CTreeCtrl所有结点 参数
  • expected type: java.lang.String, actual value: $Proxy26

    这个错误是在什么情况下报出的 sqlsever ssh的 时候 使用的是非持久化的查询 因为是多服务器查询 query getSession createSQLQuery sql setResultTransformer Transform
  • 2023-9-14 最长上升子序列

    题目链接 最长上升子序列 include
  • C# 序列化与反序列化几种格式的转换

    这里介绍了几种方式之间的序列化与反序列化之间的转换 首先介绍的如何序列化 将object对象序列化常见的两种方式即string和xml对象 第一种将object转换为string对象 这种比较简单没有什么可谈的 public string
  • Eclipse-修改工程名

    直接修改工程可能会产生一些莫名其妙的问题 需遵循以下四步 1 右键工程 Refactor gt Rename 或选中工程按F2 修改名称 2 右键工程 Properties gt Web Project Settings 修改Context
  • 性能测试的方法

    性能测试主要采用的方法有 1 负载测试 通过对系统不断的加压 直到超过预定的指标或者部分资源达到一种饱和状态不能再加压为止 该方法主要用于找到系统最大的负载能力 为性能调优提供数据 2 压力测试 指系统已经达到一定的饱和程度 CPU 磁盘等
  • Django2.0-redis

    redis 概述 redis是一种nosql数据库 他的数据是保存在内存中 同时redis可以定时把内存数据同步到磁盘 即可以将数据持久化 并且他比memcached支持更多的数据结构 string list列表 队列和栈 set 集合 s
  • LRU和LFU的区别

    分析 回答 LRU和LFU都是内存管理的页面置换算法 LRU 即 最近最少使用淘汰算法 Least Recently Used LRU是淘汰最长时间没有被使用的页面 LRU关键是看数据最后一次被使用到发生替换的时间长短 时间越长 数据就会被
  • 都在用 AI 生成美少女,而我却。。。

    最近 AI 画画特别的火 你能从网上看到非常多好看的图片 于是我就开始了我的安装之旅 我看到的图是这样的 这样的 还有这样的 然后我就开始了我的 AI 安装生成计划 安装环境 首先我们需要安装 Python 环境 因为这个需要显卡 我估计我
  • [C++]for 循环多个限制条件

    for int i 0 j 0 i lt 5 j lt 7 i j 那么最后判断的会是j lt 7的条件 应该写成 for int i 0 j 0 i lt 5 j lt 7 i j 转载于 https www cnblogs com dr
  • django celery简单 例子

    django celery简单 例子 https docs celeryq dev en latest django first steps with django html pip list pip install Django4 2 3
  • Oracle的基本数据类型总结

    1 字符类型 CHAR 一个定长字符串 当位数不足自动用空格填充来达到其最大长度 如非NULL的CHAR 12 总是包含12字节信息 CHAR字段最多可以存储2 000字节的信息 VARCHAR2 这是一个变长字符串 与CHAR 类型不同
  • JavaScript WebGL 三维相关概念

    引子 在 JavaScript WebGL 矩阵之后 发现在实现三维效果之前还有一些概念需要理解 就去查了下资料 按照自己的习惯整合了一下 Origin My GitHub 齐次坐标 三维坐标理论上三个分量就够了 但在看相关程序的时候 发现