《vtk9 book》 官方web版 第3章 - 计算机图形基础 (3 / 5)






3.8 演员几何
我们已经看到了光照属性如何控制演员的外观,以及相机如何结合变换矩阵将演员投影到图像平面上。剩下的是定义演员的几何形状,以及如何将其定位在世界坐标系中。
建模
计算机图形学研究中的一个重要主题是建模或表示物体的几何形状。已经应用了各种数学技术,包括点、线、多边形、各种形式的曲线和样条线,甚至是隐式的数学函数的组合。
这个主题超出了本文的范围。这里重要的一点是,存在一个指定对象形状及其在模型坐标系中位置的基础几何模型。
在数据可视化中,建模扮演着不同的角色。与直接创建几何形状来表示对象不同,可视化算法计算这些形式。通常几何形状是抽象的(如等高线),与真实世界的几何关系不大。当我们描述可视化算法时,我们将看到这些模型是如何计算的,这将在第6章 - 基本算法和第9章 - 高级算法中介绍。
数据可视化的几何表示往往是简单的,尽管计算这些表示并不简单。这些形式通常是基本形状,如点、线和多边形,或者是体积数据等可视化数据。我们使用简单的形式是因为我们希望实现高性能和交互式系统。因此,我们利用计算机硬件(将在“图形硬件”中介绍)或者像体积渲染这样的特殊渲染技术。
演员的位置和方向
每个演员都有一个控制其在世界空间中位置和缩放的变换矩阵。演员的几何形状是在模型坐标中定义的模型。我们使用方向、位置和沿坐标轴的比例因子来指定演员的位置。此外,我们可以定义一个围绕其旋转的原点。这个特性很有用,因为我们可以围绕演员的中心或其他有意义的点旋转演员。
演员的方向由存储在方向向量(Ox,Roy,Oz)中的旋转确定。这个向量定义了一系列旋转变换矩阵。正如我们在前一节关于变换矩阵中所看到的,变换的应用顺序不是任意的。我们已经选择了一个基于我们认为对用户自然的固定顺序。变换的顺序是先围绕 y 轴旋转 O y,然后围绕 x 轴旋转 O x,最后围绕 z 轴旋转 O z。这个顺序是任意的,基于标准摄像机操作。这些操作(按顺序)是摄像机方位角,然后是仰角,最后是翻转(图3-15)。
所有这些旋转都发生在演员的原点周围。通常这被设置为其包围框的中心,但也可以设置为任何方便的点。有许多不同的方法可以改变演员的方向。RotateX()、RotateY() 和 RotateZ() 是常见的围绕各自轴旋转的方法。许多系统还包括围绕用户定义的轴旋转的方法。在可视化工具包中,RotateXYZ() 方法用于围绕通过原点的任意矢量旋转。

(图3-15)演员坐标系
3.9 图形硬件
前面我们提到,图形硬件的进步对渲染的执行方式产生了重大影响。现在我们已经介绍了场景渲染的基础知识,接下来我们将看一些硬件问题。首先,我们讨论了取代矢量显示器成为主要输出设备的光栅设备。然后,我们将研究程序如何与图形硬件进行通信。我们还将研究计算机图形中使用的不同坐标系、隐藏线/面消除和z缓冲。
光栅设备
计算机图形的结果在当今世界中无处不在——使用计算机图形生成的数字图像可能出现在手机上、显示在计算机监视器上、在电视上播放、在电影院展示,并在电子广告牌上呈现。所有这些,以及许多其他显示媒介都是光栅设备。光栅设备使用称为像素的图片元素的二维数组来表示图像。例如,单词“hello”可以被表示为一个像素数组,如图3-15所示。在这里,“hello”这个词是写在一个宽25像素、高10像素的像素数组中的。每个像素存储一位信息,无论是黑色还是白色。这就是黑白激光打印机的工作原理,对于纸张上的每个点,它要么打印一个黑点,要么保持纸张的颜色。由于硬件限制,光栅设备如激光打印机和计算机监视器实际上并不像图3-16中那样绘制精确的方形像素。相反,它们往往略微模糊并重叠。光栅设备的另一个硬件限制是它们的分辨率。这就是为什么300 dpi(每英寸点数)的激光打印机会产生比九针点阵打印机更详细的输出的原因。300 dpi的激光打印机的分辨率是每英寸300像素,而点阵打印机的分辨率大约为50 dpi。


彩色计算机显示器通常具有大约80像素每英寸的分辨率,使屏幕成为大约一千像素宽和高的像素阵列。这导致超过一百万个像素,每个像素都有一个值,指示它应该是什么颜色。由于彩色显示器中的硬件使用RGB系统,因此使用该系统来描述像素中的颜色是有意义的。不幸的是,每个像素都有红色、绿色和蓝色分量,可能会占用大量内存。这是市场上各种图形硬件之间差异的一部分。一些公司每个像素使用24位的存储空间,其他公司使用8位,一些高级系统每个像素使用超过100位的存储空间。通常,每个像素的位数越多,颜色就越准确。
在图形硬件中解决颜色限制的一种方法是使用一种称为抖动的技术。例如,假设您想使用一些不同的灰色调,但您的图形硬件只支持黑色和白色。抖动使您可以通过使用黑色和白色像素的混合来近似灰色调。在图3-17中,使用黑色和白色像素的混合绘制了七个灰色方块。从远处看,这七个方块看起来像不同的灰色调,即使在近处看,很明显它们只是不同的黑色和白色像素的混合。这种技术对其他颜色同样有效。例如,如果您的图形硬件支持主蓝色、主绿色和白色,但不支持淡海绿色,您可以通过对硬件支持的绿色、蓝色和白色进行抖动来近似这种颜色。
与硬件接口
现在我们已经讨论了显示硬件的基础知识,好消息是你很少需要担心它们。大多数图形编程都是使用比单个像素更高级的原语完成的。图3-18显示了一个典型的可视化程序布局。在层次结构的底部是我们已经讨论过的显示硬件;你的程序很可能不会直接与它交互。在硬件上面的三个层次是你可能需要关注的层次。

许多程序利用应用程序库作为系统图形功能的高级接口。本书附带的可视化工具包就是一个很好的例子。它允许你仅使用几个命令显示复杂对象或图形。还可以与许多不同的图形库进行接口,因为不同的库可能在不同的硬件平台上受支持。
图形库和图形硬件层都执行类似的功能。它们负责接收来自应用程序库或程序的高级命令,并执行它们。通过提供更复杂的原语,这使得编程变得更容易。我们可以绘制像多边形、三角形和线段这样的原语,而不必担心哪些像素设置为哪种颜色的细节。图3-19说明了所有主流图形库支持的一些高级原语。
这种功能被分为两个不同的层次,因为不同的机器可能具有非常不同的图形硬件。如果你编写一个绘制红色多边形的程序,图形库或图形硬件必须能够执行该命令。在高端系统上,这可能是在图形硬件中完成的,而在其他系统上,图形库会在软件中完成。因此,相同的命令可以在各种各样的机器上使用,而不必担心底层的图形硬件。
图3-19中原语的基本构建块是一个点(或顶点)。一个顶点有一个位置、法线和颜色,每个都是一个三元素向量。位置指定了顶点的位置,法线指定了顶点面向的方向,颜色指定了顶点的红色、绿色和蓝色分量。

多边形是通过连接一系列点或顶点构建的,如图3-20所示。你可能会想为什么每个顶点都有一个法线,而不是整个多边形只有一个法线。一个平面多边形无论其顶点的法线指示什么,只能面向一个方向。原因是有时多边形被用作其他东西的近似,比如曲线。图3-21显示了一个圆柱的俯视图。如你所见,它实际上不是一个圆柱,而是一个用灰色绘制的多边形近似圆柱。每个顶点被两个多边形共享,顶点的正确法线与多边形的法线不同。类似的逻辑解释了为什么每个顶点都有一个颜色,而不是整个多边形只有一个颜色。
当您限制自己使用上述描述的原始类型时,许多图形系统支持一些附加属性。边缘颜色和边缘可见性可用于突出显示构成演员的多边形原语。另一种方法是通过将表示从表面调整为线框或点来实现。这将分别用它们的边界边缘或点替换多边形等表面。虽然从物理角度来看这可能没有太多意义,但在某些插图中可能会有所帮助。在渲染CAD模型时使用边缘可见性可以帮助显示组成模型的不同部分。
光栅化
到目前为止,我们已经描述了如何使用渲染基元表示图形数据,以及如何使用光栅显示设备表示图像。问题是,我们如何将图形基元转换为光栅图像呢?这是我们在本节中要讨论的主题。虽然对这个主题进行详尽的论述超出了本文的范围,但我们会尽力提供一个高层次的概述。

光栅化或扫描转换是将几何表示转换为光栅图像的过程。在接下来的描述中,我们假设图形基元是三角形多边形。这并不像你想象的那样具有限制性,因为任何一般多边形都可以被分解成一组三角形。此外,其他表面表示如样条通常被图形系统分解成三角形或多边形。(这里描述的方法实际上适用于凸多边形。)

今天的大多数硬件都是基于对象顺序光栅化技术。正如我们在本章前面看到的那样,这意味着按顺序处理我们的角色。由于我们的角色由多边形基元表示,我们逐个处理多边形。因此,尽管我们描述了一个多边形的处理过程,请记住实际上会处理许多多边形,可能还有许多角色。
第一步是使用适当的变换矩阵变换多边形。我们还使用平行或正交投影将多边形投影到图像平面上。这个过程的一部分涉及对多边形进行裁剪。我们不仅使用前后裁剪平面来裁剪太近或太远的多边形,还必须裁剪穿过图像平面边界的多边形。裁剪穿过视景体边界的多边形意味着我们必须生成新的多边形边界。

图3-22。将凸多边形转换为光栅图像。像素在图像平面上以水平跨度(或扫描线)进行处理。点$p_i$处的数据值$d_i$沿着边缘插值,然后沿着扫描线使用增量数据值进行插值。典型的数据值是颜色的RGB分量。
将多边形剪裁并投影到图像平面后,我们可以开始扫描线处理(图3-22)。第一步是识别被投影多边形所交叉的初始扫描线。这是通过对顶点的y值进行排序来找到的。然后我们找到连接左侧和右侧顶点的两条边。利用边的斜率以及数据值,我们计算出增量数据值。这些数据通常是R、G和B颜色分量。其他数据值包括透明度值和z深度值。(如果我们使用z缓冲区,描述在下一节中。)多边形内的像素行(即从左侧和右侧边缘开始)称为跨度。数据值从跨度两侧的边插值以计算内部像素值。这个过程一直持续到整个多边形被填满。请注意,当遇到新的顶点时,需要重新计算增量数据值。
多边形的着色(即多边形上的颜色插值)取决于角色的插值属性。有三种可能性:平面着色、Gouraud着色或Phong着色。图3-7展示了平面着色和Gouraud着色之间的区别。平面着色通过将光照方程应用于多边形的一个法线(通常是表面法线)来计算多边形的颜色。Gouraud着色通过使用顶点的法线和标准光照方程在所有顶点处计算多边形的颜色。然后通过应用扫描线插值过程来填充多边形的内部和边缘。Phong着色是三者中最逼真的。它通过插值顶点法线在多边形上的每个位置计算法线。然后使用这些法线在光照方程中确定最终像素颜色。平面和Gouraud着色是常用的方法。Phong着色的复杂性使其难以在硬件中得到广泛支持。
Z缓冲
在我们之前对渲染过程的描述中,我们跟随光线从我们的眼睛穿过图像平面中的一个像素到演员,再返回到光源。光线追踪的一个好处是,观看光线会击中它们遇到的第一个演员,并忽略任何隐藏在其后面的演员。当使用上述多边形方法渲染演员时,我们没有一种方法来计算哪些多边形被隐藏了,哪些没有被隐藏。我们通常无法确定多边形是否被正确排序。相反,我们可以使用许多用于多边形渲染的隐藏表面方法。

一种方法是按照从后到前(沿着摄像机的视图向量)对所有多边形进行排序,然后按照那个顺序渲染它们。这被称为画家算法或画家排序,但它有一个主要弱点,如图3-23所示。无论我们以何种顺序绘制这三个三角形,我们都无法得到期望的结果,因为每个三角形既在另一个三角形的前面,又在其后面。有一些算法可以对多边形进行排序和分割,以处理这种情况[Carlson85]。这需要更多的初始处理来执行排序和分割。如果图像之间的几何原语发生变化或摄像机视图发生变化,则必须在每次渲染之前执行此处理。
画家算法的问题
另一个隐藏表面算法,Z缓冲,解决了这个问题,并且不需要排序。Z缓冲利用视图坐标系中的z值(即沿投影方向的深度值)。在绘制新像素之前,将比较其z值与该像素位置的当前z值。如果新像素将位于当前像素的前面,则绘制该像素并更新该像素位置的z值。否则,保持当前像素不变,新像素将被忽略。由于其简单性和稳健性,Z缓冲已被广泛实现在硬件中。Z缓冲的缺点是它需要大量内存,称为Z缓冲区,用于存储每个像素的z值。大多数系统使用深度为24或32位的Z缓冲区。对于一个1000乘1000的显示屏,这意味着仅用于Z缓冲区就需要三到四兆字节。Z缓冲的另一个问题是,它的精度受其深度的限制。24位Z缓冲区在视锥体的高度上提供了16777216分之一的精度。如果物体靠得很近,这种分辨率通常是不够的。如果遇到Z缓冲的精度问题,请确保前后裁剪平面尽可能靠近可见几何体。
相关文章:
《vtk9 book》 官方web版 第3章 - 计算机图形基础 (3 / 5)
3.8 演员几何 我们已经看到了光照属性如何控制演员的外观,以及相机如何结合变换矩阵将演员投影到图像平面上。剩下的是定义演员的几何形状,以及如何将其定位在世界坐标系中。 建模 计算机图形学研究中的一个重要主题是建模或表示物体的几何形状。…...
pytorch 函数整理
pytorch 函数整理 method_code.init.code.co_argcount:获取method_code.init 函数的输入变量的数目; input_params method_code.init.code.co_varnames:获取method_code.init 函数的输入变量的名称列表; __enter__和__exit__魔…...
docker实战之制作filebeat镜像
一,下载filebeat-6.5.4安装包: https://www.elastic.c o/downloads/beats 二,拉取centos:7镜像 docker pull centos:7 三,将下载的filebeat包放在~/filebeat下(自定义就好) 四,创建名为fileb…...
【DAY11 软考中级备考笔记】数据结构 查找和排序
数据结构 查找和排序 3月12日 – 天气:晴 1. 顺序查找 顺序查找就是简单的从头一个一个的进行比较,注意它的平均查找长度 2. 折半查找 折半查找和二叉排序树一致: 优点:查找效率很高 缺点:要求必须是循序存储并且表中…...
华为机考:HJ102 字符统计
华为机考:HJ102 字符统计 描述 方法1 先将所有字符计算数量,在对比其中字符的assic码 #include<iostream> #include<vector> #include<algorithm> #include<string> using namespace std; bool cmp(pair<char, int> a,…...
安装配置HBase
HBase集群需要整个集群所有节点安装的HBase版本保持一致,并且拥有相同的配置,具体配置步骤如下: 1. 解压缩HBase的压缩包 2. 配置HBase的环境变量 3. 修改HBase的配置文件,HBase的配置文件存放在HBase安装目录下的conf中 4. 首…...
【更新】数字金融与企业ESG表现:效应、机制与“漂绿”检验数据集(2011-2022年)
参照温亚东(2024)的做法,本团队对来自统计与决策《数字金融与企业ESG表现:效应、机制与"漂绿"检验》一文中的基准回归部分进行复刻 一、数据介绍 数据名称:数字金融与企业ESG表现 参考期刊:《统…...
手写简易操作系统(五)--获得物理内存容量
前情提要 上一章中我们进入了保护模式,并且跳转到了32位模式下执行。这一章较为简单,我们来获取物理内存的实际容量。 一、获得内存容量的方式 在Linux中有多种方法获取内存容量,如果一种方法失败,就会试用其他方法。其本质上是…...
机器学习之DeepSequence软件使用学习3-预测突变效应
import theano import numpy as np import sys import pandas as pd import scipy #scipy 模块是 Python 中用于科学计算和数据分析的重要模块之一。它包含了许多高级的数学函数和工具,包括数值积分、优化、线性代数、统计等。 from scipy.stats import spearmanr #…...
Linux文件与文件系统的压缩
文章目录 Linux文件与文件系统的压缩Linux系统常见的压缩命令gzip,zcat/zmore/zless/zgrepbzip2,bzcat/bzmore/bzless/bzgreppxz,xzcat/xzmore/xzless/xzgrepgzip,bzip2,xz压缩时间对比打包命令:tar打包命令…...
ubuntu 中进入python 编辑如何退出到命令行
文章目录 在Python解释器(交互式命令行)中,你可以使用 exit()函数或 CtrlD(在Unix/Linux/macOS上)或 CtrlZ然后输入 Enter(在Windows上)来退出Python解释器并返回到命令行。 以下是具体的步骤&a…...
2024.3.12 C++
1.思维导图 2.自己封装一个矩形类(Rect),拥有私有属性:宽度(width)、高度(height),定义公有成员函数: 初始化函数:void init(int w, int h)更改宽度的函数:set_w(int w)更改高度的函数:set_h(int h) 输出该矩形的周长和面积函数:void show() #include <iostream…...
飞塔防火墙开局百篇——002.FortiGate上网配置——透明模式配置(Transparent)
透明模式配置 开启透明模式创建策略 在不改变现有网络拓扑前提下,将防火墙NGFW以透明模式部署到网络中,放在路由器和交换机之间,防火墙为透明模式,对内网网段192.168.1.0/24的上网进行4~7层的安全防护。 登陆FortiGate防火墙界面&…...
代码随想录算法训练营第52天|300.最长递增子序列 674.最长连续递增序列 718.最长重复子数组
300.最长递增子序列 这道题还挺简单的,咱们设置dp[i]表示到第i个数字时的递增子序列的最长的值,那么dp[i]就要遍历从0到i-1的数,也就是看看当前这个数字是否比前面的数字大,如果大的话就看看现在的子序列长度是否会长于前面那个数…...
分享一些开源的游戏仓库
1.CnC_Remastered_Collection 红色警戒95版本 https://github.com/electronicarts/CnC_Remastered_Collection gitee仓库分流:https://gitee.com/loswdarmy/CnC_Remastered_Collection 2.Far-Cry-1-Source-Full 孤岛惊魂1 https://github.com/StrongPC123/Far-Cry-…...
Java详解:单列 | 双列集合 | Collections类
○ 前言: 在开发实践中,我们需要一些能够动态增长长度的容器来保存我们的数据,java中为了解决数据存储单一的情况,java中就提供了不同结构的集合类,可以让我们根据不同的场景进行数据存储的选择,如Java中提…...
Centos7 使用docker来部署mondb
参考官方手册: https://www.mongodb.com/docs/manual/tutorial/install-mongodb-community-with-docker/#std-label-docker-mongodb-community-install 使用脚本快速安装docker curl -fsSL https://get.docker.com -o get-docker.sh | bash get-docker.sh使用 Doc…...
Java SE入门及基础(35)
接口 1. 概念 在软件工程中,软件与软件的交互很重要,这就需要一个约定。每个程序员都应该能够编写实现这样的约定。接口就是对约定的描述。 In the Java programming language, an interface is a reference type, similar to a class, that can con…...
基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的常见车型识别系统(Python+PySide6界面+训练代码)
摘要:本文深入探讨了如何应用深度学习技术开发一个先进的常见车型识别系统。该系统核心采用最新的YOLOv8算法,并与早期的YOLOv7、YOLOv6、YOLOv5等版本进行性能比较,主要评估指标包括mAP和F1 Score等。详细解析了YOLOv8的工作机制,…...
Sqoop 学习
参考视频 大数据Sqoop教程丨从零开始讲解大数据业务及数据采集和迁移需求_哔哩哔哩_bilibili 介绍 Sqoop是Hadoop生态体系和RDBMS(关系型数据库)体系之间传送数据的一种工具 Hadop生态系统:HDFS,Hbase,Hive等 RDBMS包…...
多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度
一、引言:多云环境的技术复杂性本质 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时,基础设施的技术债呈现指数级积累。网络连接、身份认证、成本管理这三大核心挑战相互嵌套:跨云网络构建数据…...
Xshell远程连接Kali(默认 | 私钥)Note版
前言:xshell远程连接,私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...
【JVM】- 内存结构
引言 JVM:Java Virtual Machine 定义:Java虚拟机,Java二进制字节码的运行环境好处: 一次编写,到处运行自动内存管理,垃圾回收的功能数组下标越界检查(会抛异常,不会覆盖到其他代码…...
MODBUS TCP转CANopen 技术赋能高效协同作业
在现代工业自动化领域,MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步,这两种通讯协议也正在被逐步融合,形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...
大学生职业发展与就业创业指导教学评价
这里是引用 作为软工2203/2204班的学生,我们非常感谢您在《大学生职业发展与就业创业指导》课程中的悉心教导。这门课程对我们即将面临实习和就业的工科学生来说至关重要,而您认真负责的教学态度,让课程的每一部分都充满了实用价值。 尤其让我…...
有限自动机到正规文法转换器v1.0
1 项目简介 这是一个功能强大的有限自动机(Finite Automaton, FA)到正规文法(Regular Grammar)转换器,它配备了一个直观且完整的图形用户界面,使用户能够轻松地进行操作和观察。该程序基于编译原理中的经典…...
【Redis】笔记|第8节|大厂高并发缓存架构实战与优化
缓存架构 代码结构 代码详情 功能点: 多级缓存,先查本地缓存,再查Redis,最后才查数据库热点数据重建逻辑使用分布式锁,二次查询更新缓存采用读写锁提升性能采用Redis的发布订阅机制通知所有实例更新本地缓存适用读多…...
纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join
纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join 1、依赖1.1、依赖版本1.2、pom.xml 2、代码2.1、SqlSession 构造器2.2、MybatisPlus代码生成器2.3、获取 config.yml 配置2.3.1、config.yml2.3.2、项目配置类 2.4、ftl 模板2.4.1、…...
pycharm 设置环境出错
pycharm 设置环境出错 pycharm 新建项目,设置虚拟环境,出错 pycharm 出错 Cannot open Local Failed to start [powershell.exe, -NoExit, -ExecutionPolicy, Bypass, -File, C:\Program Files\JetBrains\PyCharm 2024.1.3\plugins\terminal\shell-int…...
Kubernetes 节点自动伸缩(Cluster Autoscaler)原理与实践
在 Kubernetes 集群中,如何在保障应用高可用的同时有效地管理资源,一直是运维人员和开发者关注的重点。随着微服务架构的普及,集群内各个服务的负载波动日趋明显,传统的手动扩缩容方式已无法满足实时性和弹性需求。 Cluster Auto…...
