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

这篇具有很好参考价值的文章主要介绍了GAMES101 计算机图形学 | 学习笔记 (上)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

环境安装

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

齐次坐标

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

要将一个点的齐次坐标表示转换为三维坐标表示,可以将其除以 w,即:
GAMES101 计算机图形学 | 学习笔记 (上)
这样可以得到点在三维坐标系中的位置。

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

光栅化

光栅化(Rasterization)是计算机图形学中将图形对象转换为屏幕上的像素的过程。
模型都是由一个个三角形组成,光栅化过程,是将三角形离散显示到屏幕的每个像素点。
GAMES101 计算机图形学 | 学习笔记 (上)

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

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

方法二:点的三角形重心坐标是否都大于0,大于0则在三角形内。GAMES101 计算机图形学 | 学习笔记 (上)

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

#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;
}

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

光栅化产生的问题

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

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

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

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

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

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

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

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

本来想采样波形,因为采样不足,导致波形周期远大于原始曲线周期。
GAMES101 计算机图形学 | 学习笔记 (上)

抗锯齿滤波算法

  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通过在时间上对帧进行采样和合成来减少锯齿效应和运动模糊,并提供更平滑的边缘和图像。文章来源地址https://www.toymoban.com/news/detail-436858.html

到了这里,关于GAMES101 计算机图形学 | 学习笔记 (上)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 计算机图形学与opengl C++版 学习笔记 第12章 曲面细分

    术语Tessellation(镶嵌)是指一大类设计活动,通常是指在平坦的表面上,用各种几何形状的瓷砖相邻排列以形成图案。它的目的可以是艺术性的或实用性的,很多例子可以追溯到几千年前[TS16]。 在3D图形学中,Tessellation指的是有点不同的东西(曲面细分),但显然是由它的经

    2024年02月08日
    浏览(38)
  • 计算机图形学与opengl C++版 学习笔记 第9章 天空和背景

    对于室外3D场景,通常可以通过在地平线上创造一些逼真的效果,来增强其真实感。当我们极目远眺,目光越过附近的建筑和森林,我们习惯于看到远处的大型物体,例如:云、群山或太阳(或夜 空中的星星和月亮)。但是,将这些对象作为单个模型添加到场景中可能会产生

    2024年02月09日
    浏览(39)
  • 计算机图形学与opengl C++版 学习笔记 第10章 增强表面细节

    假设我们想要对不规则表面的物体进行建模,例如橘子凹凸的表皮、葡萄干褶皱的表面或月球的陨石坑表面。我们该怎么做?到目前为止,我们已经学会了两种可能的方法: (a)我们可以对整个不规则表面进行建模,但这么做通常不切实际(一个有许多坑的表面需要大量的

    2024年02月09日
    浏览(47)
  • Python+OpenCV 零基础学习笔记(4-5):计算机图形基础+Python相对文件路径+OpenCV图像+OpenCV视频

    【2022B站最好的OpenCV课程推荐】OpenCV从入门到实战 全套课程 CSDN标题里个括号对应视频的分P OpenCV+Python CSDN专栏 Gitee 项目地址 Python:3.11.5 Anaconda:23.7.4 IDE:vscode 运行环境:Windows OpenCV:4.8.1 Python+OpenCV 零基础学习笔记(1-3):anaconda+vscode+jupyter环境配置 本节课来了解以下OpenCV的简单使用

    2024年02月03日
    浏览(75)
  • 计算机图形学 期末复习笔记

    目录 第一章-导论 1. 计算机图形学的定义 2. 计算机图形学的应用领域 2.1 计算机图形学与其他学科的关系 3. 图形显示器的发展及其工作原理 3.1 阴极射线管(CRT) 3.2 随机扫描显示器 3.3 直视存储管显示器 3.4 光栅扫描显示器 4. 图形软件标准的形成 5. 三维图形渲染管线 第二章

    2024年02月12日
    浏览(40)
  • Games101学习笔记1

    2023-08-10开始接触图形学 参考博客:GAMES101 梳理 / 个人向图形学笔记_games101笔记_river_of_sebajun的博客-CSDN博客  向量的长度 向量的单位化  向量的点乘 点乘结果是一个数字,叉乘结果是垂直已知向量的向量  b向量投影到a向量上  矩阵的乘法 二维变换 线性变换    切边  旋转

    2024年02月13日
    浏览(35)
  • Games101学习笔记 - 变换矩阵基础

    缩放变换 : 1均匀缩放 2不均匀缩放 注意:上图是默认二维旋转的是以远点为圆转重心,并且逆时针旋转 旋转矩阵推导原理: 引入原因: 上面说了ax + by 的方式都可以写成矩阵的形式,但是平移的操作的公式如下,不能写成矩阵的形式。 只能写成如下: 为了同意变换,让他

    2024年02月15日
    浏览(29)
  • 计算机图形学环境配置java3D

    java3Dwindows64位下载 这个是默认到下图路径中:(记住这个路径,待会要导入jar包) 选择这个: 所以我把jdk改成了这个1.8版本就可以了: 将java3D目录下面的bin目录中的dll文件拷贝到idea里配置的jdk路径的bin目录下: idea里配置的jdk路径的bin目录: 把这个文件拷贝过去: 打开

    2024年02月09日
    浏览(37)
  • Part1:使用 TensorFlow 和 Keras 的 NeRF计算机图形学和深度学习——计算机图形学世界中相机的工作原理

    是否有一种方法可以仅从一个场景多张不同视角的照片中捕获整个3D场景? 有。 NeRF:将场景表示为用于视图合成的神经辐射场中(NeRF: Representing Scenes as Neural Radiance Fields for View Synthesis),Mildenhall等人(2020)的论文解答了这个问题。NeRF的更简单实现赢得了 TensorFlow社区聚光

    2024年02月07日
    浏览(47)
  • GAMES101 OpenCV环境安装

    作业2中用到了OpenCV 下载OpenCV 源码 OpenCV 4.5.4 下载OpenCV_contrib OpenCV_contrib 4.5.4 注意:这两个源码的版本号要一致 将源码解压后,不要放在有中文路径的目录 使用管理员权限打开CMake, 一开始未使用,发现点击Configure时会报错,使用管理员权限打开CMake后,点击Configure未报错。

    2024年02月17日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包