计算机图形学 3D渲染 笔记(一)

news2024/11/20 0:33:25

1 坐标系

  • 大多数计算机屏幕采用的坐标系是以左上角为原点,水平(右)为x轴,纵向(下)为y轴
  • 3D图形学习中通常使用另一种坐标系, 即 正中心为原点,水平(右)为x轴,纵向(上)为y轴
    在这里插入图片描述
    当前者坐标系转化到后者,需要进行简单的转化。
(Sx 、Sy为新坐标, Cx、Sy为旧坐标、Cw、Ch为范围宽高)
Sx = Cw/2 + Cx
Sy = Ch/2 - Cy

2 减色法模型

  • 白光包含各种波长的光,当光照射到一个物体的表面时,物体的表面会吸收其一部分的光,反射其它部分的光,这取决于物体的材质。一些反射光会进入我们的眼睛,然后我们的大脑将其转化成颜色,这个颜色就是物体表面反射的波长总和所形成的颜色
  • 在白纸上用蜡笔画黄色,能看到黄色的原理:
    1. 因为是白纸,它能反射基本上所有的光
    2. 黄色的蜡笔在纸上画,其实是涂上了一层材料,这个材料可以吸收一部分波长的光,而其它波长的光则会通过
    3. 这些通过的光会被白纸反射,第二次穿过材料,进入我们的眼睛,我们的大脑会把这种特定波长的光组合解释成“黄色”
    4. 综上所述,这一层“黄色”的材料的作用就是从原始的白光中减去一部分特定波长的光。
    5. 同样可以思考其它颜色,我们在黄色上叠加蓝色,相当于是一个特定波长组合减去另一个特定波长组合,得到新的波长组合被我们的大脑解释为“绿色”
  • 减色法中的三原色是:品红色(magenta)、青色(cyan)、黄色(yello),再加上原色:纯黑(因为前三色综合并不是一个纯黑色),这也是 CMYK颜色模型

3. 加色法模型

  • 屏幕和纸张是相反的,纸张本身不发光,而是反射部分光。而屏幕本身是黑色的,但它们会自身发光。
  • 对于纸张,我们减去不想要波长的光,而屏幕上,我们从没有光开始,然后添加我们想要的波长的光。
  • 为此屏幕需要不同的原色,大多数颜色都可以来自红色(R)、蓝色(B)和绿色(G),也就是 RGB颜色模型,也是加法模型。

4. 颜色深度和颜色表示法

  • 大部分场景下,用8位二进制来表示一种原色(FF),称一种原色为颜色通道。一个像素由三个通道组成,就是24位二进制,总共 2^24(1670万)种不同的原色。这种格式被称为 R8G8B8/888格式,我们认为这种格式的颜色深度为24位
  • 由于我们眼睛对绿色的变化比对红色和蓝色更加敏感,所以还有其它格式,例如 R5G6B5/565 的16位格式, 也节省了内存。
  • 我们使用三个字节来表示一种颜色,每个字节保存从0到255的8位颜色通道的值。我们将颜色表示为 (R,G,B),如 (232,131,20)

5. 光线追踪基本

  • 我们通过视口(viewprot,也称为投影平面)进行观察, 而视口的大小(Vw、Vh)和视口到相机的距离(d)决定了相机可以观察的角度,称为视野(Field of view,简称 FOV)。人类有将近 180° 的水平视野。为简单起见,我们设置 Vw=Vh=d=1,这样使得相机视野大约为 53°,从而可以生成合理的图像。
  • 画布上的坐标(Cx,Cy)和视口坐标(Vx,Vy,Vz)的转化方程:
    • Vx = Cx Vw/Cw
    • Vy = Cy Vh/Ch
    • Vz = D
      方程解读:我们在画布上画的就是视口上看到的东西,如果画布长宽大小等于视口长宽,则 (Cx, Cy) 和 (Vx, Vy) 是一样的,而大部分时候画布长宽和视口长宽不一样,但是比例一样,因此 Cw/Cx = Vw/Vx;其次,摄像机到视口的距离就是到画布距离,因此 Vz 恒等为 d(可能后期摄像机会改变),所以得到这个方程。
  • 射线方程:
    • P = O + t(V- O) , O为相机点, V为射线上任意一点, P为O到V的线段距离,t为任意实数
    • 由于 V-O = D,因此方程亏简化为: P = O + tD
  • 使用画布来光线追踪渲染球体模型,整体思路和步骤如下:
    1. 假设摄像机为原点,即 O(0,0,0), 球体为一个数据结构,能够知道它任意一点的颜色(Color)、圆心(CO)和半径®
    2. 遍历画布,拿到任意像素点 C(Cx, Cy)
    3. 根据画布-视口坐标转化方程,拿到其在视口中的坐标 V(Vx, Vy, Vz)
    4. 获取射线 OV(O -> V)的射线方程(P=O+tD), 并和球形上点方程((P-C)·(P-C)=r²)进行相交点计算, 根据二元一次方程,得出 {t1, t2}要求 t 大于1且小于最大值(因为要画出视口前方的东西,所以视口之后的不需要展示), t 没有时(b²-4ac<0)说明没有射线和球没有相交。 t有一个值时(b²-4ac=0)说明相交于一点, t有两个值时(b²-4ac>0),此时要取离相机最近的那个值,也就是在范围中更小的那个 t值,因为远的那个我们在视口上看不到
    5. 通过 t 获取球上的一点,拿到其颜色(Color)
    6. 在画布 C(x,y) 上绘制这个颜色

6. 光源

  • 点光,在 3D 控件中的一个固定的点发射出光,这个点被称为点光源的位置,它向每个方向都均匀发射光,所以也被称为全向光(omnidirectional light),因此点光可以完全用位置和强度来进行描述。每个观察点 P 都距离光源 O 有不同的向量 L
  • 方向光,它有强度,但没有位置,它有一个固定的方向,类似人类与太阳(太过遥远,每条光都是平行线一样)。对于每个观察点 P,都距离光源 O 有相同的向量 L,L将会是 (太阳中心) - (地球中心)
  • 环境光,3D环境中,光靠点光和方向光不足以照亮一个场景,因为这样要么全亮,要么全黑。现实世界中,当光照到一个物体时,它会吸收一部分光,并散射一部分光,这样我们才能看到阴影下的物体,所以一个物体被光照到时,它也便成为一个光源,但是这种模型是极其复杂的(全局光照(global illumination))。所以在 3D 环境中,我们声明环境光为场景中的每个点都贡献一点光,它只有强度这个象征(亮不亮暗不暗),这是一种粗略的简化,但是它的效果还可以。

一般来说,一个场景会有单个环境光(因为环境光只有一个强度,任意数量的环境光都可以简单地组合成一个环境光),和任意数量的点光和方向光。

  • 向量点积(内积)
    向量V和W的夹角为α,则它们的点积为:V · W = |V| · |W| · cos(α)
    自身的点积为:V·V = Vx² + Vy² + Vz² = |V|²,也就是自身长度的平方

  • 向量叉积
    R = V × W,则计算过程如下:

    1. Rx = VyWz - VzWy
    2. Ry = VzWx - VxWz
    3. Rz = VxWy - VyWx
  • 对漫反射建模(哑光物体)
    若宽度(强度)为 I 的 L 向量光以β角度射到点 P,产生 A 区域,P点法向量为 N,那么:I/A = N·L/|N||L|, 这是反射光的比例函数,是物体表面法线和光线方向之间夹角的比例。它的取值范围是 cos(90-β)=cos(α),由于大于 90 °时,该值是负数,因此相当于光找事到了其背面,相当于是黑暗的,因此我们只取其为正数的时候,也就是 -90° <= α <= 90 °,0<=cos(α)<=1
    因此可以得出场景中点 P 的漫反射方程为: Ip = Ia + Σ(i=1 n)Ia(N·Li / |N||Li|),其中 Ia 为环境光强度, Li 为第i个方向光/点光的强度,西格玛用于计算每个点光或方向光的下单位面积的光强度,并去除 N·Li < 0 的情况

  • 法向量 N 是单位向量,因此长度为1, 在球体中,若 C 为原点,则 P 点的法向量计算为: N = P-C/|P-C|

  • 镜面反射(闪亮物体)
    通过镜面反射,需要计算进入相机的反射光,因此还要加上这部分的轻度光。而用 S 来表示物体的光泽度,向量 R 表示光线根据法线反射出的向量。 V 向量(进入相机的向量)就是追踪光的 -D 向量。因此最终的反射方程为:
    Ip = Ia + Σ(i=1,n)Ii [ (N·Li)/(|N||Li|) + (Ri·V)/|Ri||V|)² ]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/699458.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【算法题解】44. N 叉树的前序遍历(递归 + 迭代)

这是一道 简单 题 https://leetcode.cn/problems/n-ary-tree-preorder-traversal/ 题目 给定一个 n 叉树的根节点 root &#xff0c;返回 其节点值的 前序遍历 。 n 叉树 在输入中按层序遍历进行序列化表示&#xff0c;每组子节点由空值 null 分隔&#xff08;请参见示例&…

Golang源码探究——从Go程序的入口到GMP模型

在大多数的编程语言中&#xff0c;main函数都是用户程序的入口函数&#xff0c;go中也是如此。那么main.main是整个程序的入口吗, 肯定不是&#xff0c;因为go程序依赖于runtime&#xff0c;在程序的初始阶段需要初始化运行时&#xff0c;之后才会运行到用户的main函数&#xf…

【话题达人】做开发时遇到过无理的需求吗?面对这些无理需求你是怎么做的?

导读 工作过程中难免遇见一些“神奇的甲方”&#xff0c;他们总是会给你提出一些匪夷所思甚至无厘头的需求。你是否也有这样的经历&#xff0c;面对这样“无理的需求”你又是怎么做的呢&#xff1f; 面对这些无理需求时你是怎么做的&#xff1f; 首先深入了解需求&#xff0…

C++一键安装工具(vcpkg)

0. 简介 相较于python而言&#xff0c;C因为其复杂的环境安装一直受到很多人的诟病&#xff0c;比如说一个pcl的安装就需要有很多操作步骤。译过程仍然复杂和多样化。当了解了这些还不够&#xff0c;我们还需要考虑预先编译出哪种类型的开源库程序。比如&#xff1a;Debug还是…

快速掌握MongoDB数据库(入门一条龙)

目录 一、介绍 二、安装指导 2.1 下载 2.2 安装注意事项 2.3 配置环境变量 2.4 校验是否配置成功 2.5 启动服务器 2.6 打开客户端 2.7 退出 2.8 修改参数配置 2.9 设置开启自启动服务 三、MongoDB基本操作 3.1 基本概念 3.2 基本命令 3.3 数据库的crud命令 四、…

七、云尚办公-Activiti入门

云尚办公系统&#xff1a;Activiti入门 B站直达【为尚硅谷点赞】: https://www.bilibili.com/video/BV1Ya411S7aT 本博文以课程相关为主发布&#xff0c;并且融入了自己的一些看法以及对学习过程中遇见的问题给出相关的解决方法。一起学习一起进步&#xff01;&#xff01;&am…

《C++高级编程》读书笔记(十三:C++ I/O揭秘)

1、参考引用 C高级编程&#xff08;第4版&#xff0c;C17标准&#xff09;马克葛瑞格尔 2、建议先看《21天学通C》 这本书入门&#xff0c;笔记链接如下 21天学通C读书笔记&#xff08;文章链接汇总&#xff09; 1. 使用流 1.1 流的含义 C 中预定义的流 缓冲的流和非缓冲的流…

SpringBoot:配置Jetty容器

&#x1f468;‍&#x1f393;作者&#xff1a;bug菌 ✏️博客&#xff1a; CSDN、 掘金、 infoQ、 51CTO等 &#x1f389;简介&#xff1a;CSDN、 掘金等社区优质创作者&#xff0c;全网合计7w粉&#xff0c;对一切技术都感兴趣&#xff0c;重心偏Java方向&#xff0c;目前运营…

c语言查漏补缺

例子一 #include<iostream> using namespace std;int main() {int a[5]{1,2,3,4,5};int* ptr (int*)(a1);printf("%d",*(ptr-1));return 0; }输出结果是&#xff1a;1&#xff0c;这个很好理解&#xff0c;数组名即数组的首地址&#xff0c;&#xff08;a1&a…

Android 13(T) - binder阅读(5)- 使用ServiceManager注册服务2

上一篇笔记我们看到了binder_transaction&#xff0c;这个方法很长&#xff0c;这一篇我们将把这个方法拆分开来看binder_transaction做了什么&#xff0c;从而学习binder是如何跨进程通信的。 1 binder_transaction static void binder_transaction(struct binder_proc *proc…

如何将自定义起步依赖打成包

说明&#xff1a;之前做过一个自定义的OSS起步依赖&#xff08;http://t.csdn.cn/9aYr5&#xff09;&#xff0c;但是当时只是新建了一个Demo模块来测试自定义起步依赖能成功使用&#xff0c;本文介绍如何把自定义的起步依赖打成jar包&#xff0c;供其他项目或其他人引入依赖就…

华为云CodeArts TestPlan测试设计:守护产品开发质量之魂

华为产品质量的守护神 华为云CodeArts TestPlan测试设计是华为产品质量的守护神。华为云CodeArts TestPlan提供多维度测试设计模板、“需求-场景-测试点-测试用例” 四层测试分解设计能力&#xff0c;启发测试人员发散性思维&#xff0c;对项目环境、测试对象、质量标准、测试…

【SpringBlade-权限缺陷】API鉴权逻辑缺陷漏洞

目录 一、理论部分 简介 如何通过认证 API 鉴权 配置API放行 细颗粒度鉴权配置 结尾 二、实战部分 一、理论部分 简介 Secure 基于 JWT 封装&#xff0c;每次请求的时候&#xff0c;会拦截到需要鉴权的API请求&#xff0c;并对其请求头携带的Token进行认证。若 Token…

Js时间倒计时

&#x1f607;作者介绍&#xff1a;一个有梦想、有理想、有目标的&#xff0c;且渴望能够学有所成的追梦人。 &#x1f386;学习格言&#xff1a;不读书的人,思想就会停止。——狄德罗 ⛪️个人主页&#xff1a;进入博主主页 &#x1f5fc;推荐系列&#xff1a;点击进入 &#…

vue 0-1搭建项目

vue 从0-1搭建项目 前提&#xff1a;进入到需要创建项目的文件夹中&#xff0c;打开命令行窗口 windowsr 打开命令行窗口 创建vue2.0项目&#xff1a; 自动创建 1.vue create 项目名称 仅包含3个功能&#xff1a;vue2/3,babel&#xff0c;eslint 手动创建 1.vue create 项目名…

ModaHub魔搭社区:详解向量数据库Milvus的Mishards:集群分片中间件(五)

目录 在 Kubernetes 中部署 Mishards 集群 安装前提 安装流程 卸载 Mishards 从单机升级到 Mishards 集群 注意事项 基本案例 在 Kubernetes 中部署 Mishards 集群 安装前提 Kubernetes 版本 1.10 及以上Helm 版本 2.12.0 及以上 关于 Helm 的使用请参考 Helm 使用指…

【python入门系列】第一章:Python基础语法和数据类型

文章目录 前言一、简单语法1. 注释 这是一个单行注释2. 变量 二、数据类型1.字符串2.整数3.浮点数4.布尔值5.列表 三、运算符1.算术运算符&#xff1a;用于执行基本的算术操作&#xff0c;如加、减、乘和除。2.比较运算符&#xff1a;用于比较两个值的大小或相等性。3.逻辑运算…

01.网络编程-基础概念

网络编程就是指编写互联网项目&#xff0c;项目可以通过网络传输数据进行通讯 网络编程最主要的工作就是在发送端把信息通过规定好的协议进行组装包&#xff0c;在接收端按照规定好的协议把包进行解析&#xff0c;从而提取出对应的信息&#xff0c;达到通信的目的 1.1 软件结构…

Oracle 11g安装配置完美教程 - Windows

写在前面&#xff1a;博主是一只经过实战开发历练后投身培训事业的“小山猪”&#xff0c;昵称取自动画片《狮子王》中的“彭彭”&#xff0c;总是以乐观、积极的心态对待周边的事物。本人的技术路线从Java全栈工程师一路奔向大数据开发、数据挖掘领域&#xff0c;如今终有小成…

用Java解决华为OD机试考题,目标300+真题,清单奉上,祝你上岸

华为OD机考大纲 其它语言版本华为 OD 机试题清单&#xff08;机试题库还在逐日更新&#xff09;详细大纲 其它语言版本 本目录为华为od机试JS题解目录&#xff0c;其它版本清单如下 ⭐️华为OD机考 Python https://blog.csdn.net/hihell/category_12199275.html ⭐️华为OD机考…