GAMES101 计算机图形学 | 学习笔记 (上)

news2024/12/23 9:01:45

目录

  • 环境安装
  • 什么是计算机图形学
  • 物体上点的坐标变换顺序
  • 齐次坐标
  • 光栅化
    • 如何判定一个点在三角形内
    • 光栅化填充三角形示例代码
    • 光栅化产生的问题
  • 采样不足(欠采样)导致锯齿
    • 抗锯齿滤波算法

环境安装

1. C++中安装opencv库

2. C++中安装eigen库

3. C++中安装openGL库 步骤(1)glut下载

4. C++安装openGL库 步骤(2)VS中安装两个NuGet程序包

5. C++安装glew和glfw工具库
要注意的是 glew.h必须包含再glut.h之前

如下:

#include <glew.h>
#include <GL/glut.h>

什么是计算机图形学

计算机图形学是利用计算机技术进行图像和视觉内容的创建、处理和显示的领域。它包括2D和3D图形,并利用各种技术、算法和工具来生成、修改和渲染图像。
计算机图形学可以分为几个子领域:

  1. 渲染:从3D模型生成逼真或风格化图像的过程,考虑到光照、阴影和其他视觉效果。
  2. 建模:使用数学或几何技术创建物体或场景的数字表示。这涉及到定义物体的形状、结构和属性
  3. 动画:通过按顺序排列一系列图像或帧来创建运动的错觉。它涉及到关键帧、插值和骨骼动画等技术。
  4. 模拟和虚拟现实:利用计算机图形学来模拟真实世界的现象或创建沉浸式虚拟环境。这包括物理模拟、车辆或环境的虚拟模拟以及交互式虚拟现实体验。
  5. 图像处理:使用算法对数字图像进行操作和增强,以改善质量、去除噪声、提取信息或应用艺术效果。
  6. 计算机视觉:分析和解释视觉数据,提取有意义的信息或理解图像或视频的内容。这包括物体识别、图像分割和运动跟踪等任务。

计算机图形学在各个行业和领域都有应用,包括娱乐(电影、电子游戏)、设计和可视化(建筑、工业设计)、虚拟现实和增强现实、科学模拟、医学成像和数据可视化。它在创建视觉上吸引人和交互式的数字内容方面起着关键作用。

刘利刚教授:计算机图形学主要包含四大部分的内容:建模(Modeling)、渲染(Rendering)、动画(Animation)和人机交互(Human–computer Interaction, HCI)

物体上点的坐标变换顺序

在计算机图形学中,通常使用一系列变换将物体从模型空间(Model Space)变换到最终的屏幕空间(Screen Space)。这些变换的顺序可以根据实际需求进行组合。

在给定的坐标变换顺序"M->V->P"中,M代表模型变换(Model Transformation),V代表视图变换(View Transformation),P代表投影变换(Projection Transformation)。下面是每个变换的解释:

  1. 模型变换(Model Transformation)(M):
    模型变换将物体从模型空间转换到世界空间(World Space)。在这个变换中,物体的位置、旋转和缩放发生变化,以便将物体放置在正确的世界位置和大小
  2. 视图变换(View Transformation)(V):
    视图变换将物体从世界空间转换到相机或观察者的空间,也称为视口空间(View Space)或眼空间(Eye Space)。这个变换决定了观察者的位置和方向,通过这个变换可以实现摄像机的移动和旋转
  3. 投影变换(Projection Transformation)(P):
    投影变换将物体从视口空间转换到裁剪空间(Clip Space)。在裁剪空间中,物体被投影为二维坐标,并且应用了透视效果。投影变换可以是透视投影或正交投影,具体取决于所需的效果。

补充 两种投影变换

  1. 正交投影:正交投影是一种平行投影方式,它将物体投影到一个平行于观察平面的平面上。在正交投影中,物体在不同深度上的点被等比例地缩放到二维平面上,没有透视效果。所有平行线在投影后仍然保持平行,长度和角度都得到保持。这种投影方式常用于需要保持物体尺寸和形状的场景,如工程图和平面设计。

  2. 透视投影:透视投影是模拟人眼视觉效果的投影方式,具有近大远小的效果。在透视投影中,物体在不同深度上的点根据其距离观察者的远近而有所变化。离观察者更远的点在投影中被缩小,离观察者更近的点则被放大。透视投影通过模拟焦点和视角的概念,使投影更贴近真实的视觉感知。这种投影方式常用于计算机图形学中创建逼真的三维场景,如游戏、虚拟现实和电影特效。
    在这里插入图片描述
    左图是透视投影效果
    右图是正交投影效果

齐次坐标

齐次坐标可以将平移也表示为矩阵的乘法操作。
原因:
齐次坐标是一种扩展的坐标系统,由一组三维坐标(x, y, z)和一个额外的缩放因子(w)组成。在齐次坐标系中,一个点的坐标表示为(x, y, z, w)。
平移可以通过将一个点的坐标与平移矩阵相乘来实现。平移矩阵是一个4x4的矩阵,形式如下:
在这里插入图片描述
其中,(tx, ty, tz) 是平移的向量,表示在 x、y、z 方向上的平移距离。

要将一个点的齐次坐标表示转换为三维坐标表示,可以将其除以 w,即:
在这里插入图片描述
这样可以得到点在三维坐标系中的位置。

通过使用齐次坐标和平移矩阵的乘法,可以将平移操作与其他仿射变换(例如旋转、缩放)一起表示为单个矩阵的乘法,从而方便地进行复合变换。

光栅化

光栅化(Rasterization)是计算机图形学中将图形对象转换为屏幕上的像素的过程。
模型都是由一个个三角形组成,光栅化过程,是将三角形离散显示到屏幕的每个像素点。
在这里插入图片描述

如何判定一个点在三角形内

方法一:点在三角形三条逆时针边的左侧。具体运算可以使用P0P1xP0Q、P1P2xP1Q、P2P0xP2Q三者的z坐标是否同符号来判断,同符号则在三角形内。

方法二:点的三角形重心坐标是否都大于0,大于0则在三角形内。请添加图片描述

光栅化填充三角形示例代码

#include <opencv2/opencv.hpp>

int main() {
    // 创建空白图像
    int width = 400;
    int height = 400;
    cv::Mat image(height, width, CV_8UC3, cv::Scalar(0, 0, 0));

    // 三角形的三个顶点
    cv::Point pt1(100, 100);
    cv::Point pt2(300, 100);
    cv::Point pt3(200, 300);

    // 绘制三角形边界
    cv::line(image, pt1, pt2, cv::Scalar(255, 0, 0));
    cv::line(image, pt2, pt3, cv::Scalar(255, 0, 0));
    cv::line(image, pt3, pt1, cv::Scalar(255, 0, 0));

    // 光栅化填充三角形
    for (int y = 0; y < height; y++) {
        for (int x = 0; x < width; x++) {
            cv::Point point(x, y);
            // 使用点在三角形内的判断条件进行填充
            if (cv::pointPolygonTest(std::vector<cv::Point>{pt1, pt2, pt3}, point, false) >= 0) {
                image.at<cv::Vec3b>(y, x) = cv::Vec3b(0, 0, 255);  // 设置像素颜色为红色
            }
        }
    }

    // 显示图像
    cv::imshow("Rasterization Example", image);
    cv::waitKey(0);

    return 0;
}

效果图
在这里插入图片描述

光栅化产生的问题

锯齿严重,所以后面需要抗锯齿Anti-Aliasing

采样不足(欠采样)导致锯齿

抗锯齿的理解
抗锯齿其实并没有让像素面积更细,而是让像素的颜色不是非0即1,而是取中间的某一个值,从而从宏观上看不会锯齿明显。抗锯齿后,边界看上去会更模糊。
原理解释:

采样不足导致锯齿效应是由于图像或图形的分辨率不足以表示平滑的曲线或边缘所导致的。

在数字图像或计算机图形中,图像是由像素组成的。当图像中的曲线或边缘没有足够的像素来表示其平滑度时,就会出现锯齿状的锯齿边缘,也被称为"锯齿效应"或"走样"。

锯齿效应的主要原因是采样率不足。采样率是指在单位长度或单位角度内所采集的样本或像素数量。当采样率不足时,较光滑的曲线或边缘可能只被几个像素点近似表示,从而导致了锯齿状的边缘。

解决锯齿效应的常见方法之一是增加图像或图形的分辨率,即增加像素的数量。通过增加像素的数量,可以更准确地表示曲线或边缘,减少锯齿状的效果。

此外,还有一些抗锯齿技术可以应用,例如抗锯齿滤波算法,如多重采样抗锯齿(MSAA)、超采样抗锯齿(SSAA)、快速近似抗锯齿(FXAA)、时域抗锯齿(TXAA)等。这些技术通过在渲染过程中对图像进行额外的处理或采样,来减少或抑制锯齿效应的出现。

本来想采样波形,因为采样不足,导致波形周期远大于原始曲线周期。
请添加图片描述

抗锯齿滤波算法

  1. 多重采样抗锯齿(MSAA):多重采样抗锯齿是一种基础的抗锯齿技术。它通过在几何图形的边缘上进行多次采样,然后对采样点进行平均来减少锯齿效应。每个像素点只存储一个颜色样本和一个深度样本,但在像素覆盖的多个采样点上计算颜色和深度。这种方法能够减少锯齿,并在一定程度上保持边缘的平滑性。

openGL实现MSAA抗锯齿算法代码

#include <GL/glut.h>

void init() {
    // 设置清屏颜色为黑色
    glClearColor(0.0, 0.0, 0.0, 0.0);  
    // 启用深度测试
    glEnable(GL_DEPTH_TEST);
    // 启用多重采样抗锯齿  
    glEnable(GL_MULTISAMPLE);  
}

void display() {
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    // 在这里进行绘制操作
    glutSwapBuffers();
}

int main(int argc, char** argv) {
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH | GLUT_MULTISAMPLE);
    glutInitWindowSize(800, 600);
    glutCreateWindow("OpenGL MSAA Example");

    init();
    glutDisplayFunc(display);

    glutMainLoop();

    return 0;
}

上述示例代码中,通过调用 glEnable(GL_MULTISAMPLE) 启用了多重采样抗锯齿。这将在渲染过程中进行多次采样,并对采样点进行平均以减少锯齿效应。

  1. 超采样抗锯齿(SSAA):超采样抗锯齿是通过渲染比实际输出分辨率更高的图像,然后在将其缩小到实际输出分辨率时减少锯齿效应。它通过在较高分辨率的图像上进行采样,然后使用滤波器对采样结果进行插值,最终得到抗锯齿效果较好的图像。

  2. 快速近似抗锯齿(FXAA):快速近似抗锯齿是一种基于像素的抗锯齿算法。它通过检测边缘和锯齿的特征,并在需要的地方应用模糊和混合来减少锯齿效应。FXAA具有较低的计算成本和较好的效果,常用于实时图形渲染中。

  3. 时域抗锯齿(TXAA):时域抗锯齿是一种结合了多重采样抗锯齿和快速近似抗锯齿的技术。它利用多重采样进行几何边缘的抗锯齿,然后结合时域抗锯齿进行颜色抗锯齿。TXAA通过在时间上对帧进行采样和合成来减少锯齿效应和运动模糊,并提供更平滑的边缘和图像。

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

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

相关文章

ChatGPT调教指北,技巧就是效率!

技巧就是效率 很多人都知道ChatGPT很火很强&#xff0c;几乎无所不能&#xff0c;但跨越了重重门槛之才有机会使用的时候却有些迷茫&#xff0c;一时间不知道如何使用它。如果你就是把他当作一个普通的智能助手来看待&#xff0c;那与小爱同学有什么区别&#xff1f;甚至还差劲…

热乎的面经——踏石留印

⭐️前言⭐️ 本篇文章记录博主面试北京某公司所记录的面经&#xff0c;希望能给各位带来帮助。 &#x1f349;欢迎点赞 &#x1f44d; 收藏 ⭐留言评论 &#x1f4dd;私信必回哟&#x1f601; &#x1f349;博主将持续更新学习记录收获&#xff0c;友友们有任何问题可以在评论…

Origin如何绘制三维图形?

文章目录 0.引言1.使用矩阵簿窗口2.三维数据转换3.三维绘图4.三维曲面图5.三维XYY图6.三维符号、条状、矢量图7.等高线图 0.引言 因科研等多场景需要&#xff0c;绘制专业的图表&#xff0c;笔者对Origin进行了学习&#xff0c;本文通过《Origin 2022科学绘图与数据》及其配套素…

63.空白和视觉层级的实战应用

例如看我们之前的小网页&#xff1b; 这些标题的上下距离一样&#xff0c;这样让我们很容易对这些标题进行混淆&#xff0c;我们可以适当的添加一点空白 header, section {margin-bottom: 96px; }这样看上去似乎就好很多&#xff01; 除此之外&#xff0c;如我们之间学的空…

【line features】线特征

使用BinaryDescriptor接口提取线条并将其存储在KeyLine对象中&#xff0c;使用相同的接口计算每个提取线条的描述符&#xff0c;使用BinaryDescriptorMatcher确定从不同图像获得的描述符之间的匹配。 opencv提供接口实现 线提取和描述符计算 下面的代码片段展示了如何从图像中…

K8S相关核心概念

个人笔记&#xff1a; 要弄明白k8s的细节&#xff0c;需要知道k8s是个什么东西。它的主要功能&#xff0c;就是容器的调度--也就是把部署实例&#xff0c;根据整体资源的使用状况&#xff0c;部署到任何地方 注意任何这两个字&#xff0c;预示着你并不能够通过常规的IP、端口…

如何全面学习Object-C语言的语法知识 (Xmind Copilot生成)

网址&#xff1a;https://xmind.ai/login/ 登录后直接输入&#xff1a;如何全面学习Object-C语言的语法知识&#xff0c;就可以生成大纲 点击右上角的 按钮&#xff0c;可以显示md格式的问题&#xff0c;再点击生成全文&#xff0c;就可以生成所有内容了&#xff0c; 还有这个…

CentOS7/8 安装 5+ 以上的Linux kernel

CentOS以稳定著称&#xff0c;稳定在另外一方面就是保守。所以CentOS7还在用3.10&#xff0c;CentOS8也才是4.18。而当前最新的Linux Kernel都更新到6.0 rc3了。其他较新的发行版都用上了5.10的版本。本文简单介绍如何在CentOS7、8上直接安装5.1以上版本的第三方内核。 使用ted…

5.8晚间黄金行情走势分析及短线交易策略

近期有哪些消息面影响黄金走势&#xff1f;本周黄金多空该如何研判&#xff1f; ​黄金消息面解析&#xff1a;周一亚洲时段&#xff0c;现货黄金小幅反弹&#xff0c;目前交投于2024.3美元/盎司附近&#xff0c;一方面是金价上周五守住了 2000 整数关口&#xff0c;逢低买盘涌…

java环境Springboot框架中配置使用GDAL,并演示使用GDAL读取shapefile文件

GDAL是应用广泛的空间数据处理库&#xff0c;可以处理几何、栅格数据&#xff0c;Springboot是常用的JAVA后端开发框架。本文讲解如何在Springboot中配置使用GDAL。本文示例中使用的GDAL版本为3.4.1&#xff08;64位&#xff09; 图1 GDAL读取shp效果 一、部署GDAL类库 将GDA…

什么是点对点传输?什么是点对多传输

点对点技术&#xff08;peer-to-peer&#xff0c; 简称P2P&#xff09;又称对等互联网络技术&#xff0c;是一种网络新技术&#xff0c;依赖网络中参与者的计算能力和带宽&#xff0c;而不是把依赖都聚集在较少的几台服务器上。P2P网络通常用于通过Ad Hoc连接来连接节点。这类网…

WiFi(Wireless Fidelity)基础(四)

目录 一、基本介绍&#xff08;Introduction&#xff09; 二、进化发展&#xff08;Evolution&#xff09; 三、PHY帧&#xff08;&#xff08;PHY Frame &#xff09; 四、MAC帧&#xff08;MAC Frame &#xff09; 五、协议&#xff08;Protocol&#xff09; 六、安全&#x…

功能测试常用的测试用例大全

登录、添加、删除、查询模块是我们经常遇到的&#xff0c;这些模块的测试点该如何考虑 1)登录 ① 用户名和密码都符合要求(格式上的要求) ② 用户名和密码都不符合要求(格式上的要求) ③ 用户名符合要求&#xff0c;密码不符合要求(格式上的要求) ④ 密码符合要求&#xff0c;…

1_1torch学习

一、torch基础知识 1、torch安装 pytorch cuda版本下载地址&#xff1a;https://download.pytorch.org/whl/torch_stable.html 其中先看官网安装torch需要的cuda版本&#xff0c;之后安装cuda版本&#xff0c;之后采用pip 下载对应的torch的gpu版本whl来进行安装。使用pip安装…

Linux内核中的链表(list_head)使用分析

【摘要】本文分析了linux内核中的list_head数据结构的底层实现及其相关的各种调用源码&#xff0c;有助于理解内核中链表对象的使用。 二、内核中的队列/链表对象 在内核中存在4种不同类型的列表数据结构&#xff1a; singly-linked listssingly-linked tail queuesdoubly-lin…

SSM框架学习-bean生命周期理解

Spring启动&#xff0c;查找并加载需要被Spring管理的Bean&#xff0c;进行Bean的实例化&#xff08;反射机制&#xff09;&#xff1b;利用依赖注入完成 Bean 中所有属性值的配置注入&#xff1b; 第一类Aware接口&#xff1a; 如果 Bean 实现了 BeanNameAware 接口的话&#…

Yolov8改进---注意力机制:CoTAttention,效果秒杀CBAM、SE

1.CoTAttention 论文:https://arxiv.org/pdf/2107.12292.pdf CoTAttention网络是一种用于多模态场景下的视觉问答(Visual Question Answering,VQA)任务的神经网络模型。它是在经典的注意力机制(Attention Mechanism)上进行了改进,能够自适应地对不同的视觉和语言输入进…

day28_mysql

今日内容 零、 复习昨日 一、函数[了解,会用] 二、事务[重点,理解,面试] 三、索引[重点,理解,面试] 四、存储引擎 五、数据库范式 六、其他 零、 复习昨日 见晨考 一、函数 字符串函数数学函数日期函数日期-字符串转换函数流程函数 1.1 字符串函数 函数解释CHARSET(str)返回字…

一个简单的watch以及ESModule导入和解构的区别

背景 最近写了个很有意思的方法&#xff0c;感觉还蛮不错的就分享一下。起先是我在写calss组件的时候遇到一个问题&#xff0c;我需要监听一个导入的值&#xff0c;导入的值最开始是undefined&#xff0c;经过异步操作以后会得到一个新的值&#xff0c;而我需要在这个class组件…

[echarts] legend icon 自定义的几种方式

echarts 官方配置项 地址 一、默认 图例项的 icon circle, rect, roundRect, triangle, diamond, pin, arrow, none legend: {top: 5%,left: center,itemWidth: 20,itemHeight: 20,data: [{icon: circle, name: 搜索引擎},{icon: rect, name: 直接访问},{icon: roundRect, n…