Game101现代计算机图形学作业1

2023-11-19

一、作业描述

给定三维下三个点 v 0 ( 2.0 , 0.0 , − 2.0 ) v_0(2.0,0.0,-2.0) v0(2.0,0.0,2.0) v 1 ( 0.0 , 2.0 , − 2.0 ) v_1(0.0,2.0,-2.0) v1(0.0,2.0,2.0) v 2 ( − 2.0 , 0.0 , − 2.0 ) v_2(-2.0,0.0,-2.0) v2(2.0,0.0,2.0),你需要将三个点坐标变换为屏幕坐标并在屏幕上绘制出对应的线框三角形。
1、实现模型变换和投影变换。
2、实现绕任意轴的旋转(可选)。
get_model_matrix(float rotation_angle):逐个元素地构建模型变换矩阵并返回该矩阵。在此函数中,你只需要实现三维中绕Z轴旋转的变换矩阵,而不用处理平移与缩放。
get_projection_matrix(float eye_fov,float aspect_ratio,float zNear,float zFar):使用给定的参数逐个元素地构建投影矩阵并返回该矩阵。
以及自行补充所需要的操作

二、解决方法

一、模型变换

绕Z轴的变换
R z ( α ) = ( c o s ( α ) − s i n ( α ) 0 0 s i n ( α ) c o s ( α ) 0 0 0 0 1 0 0 0 0 1 ) R_z(\alpha)=\left(\begin{matrix} cos(\alpha)&-sin(\alpha)&0&0\\ sin(\alpha)&cos(\alpha)&0&0\\ 0&0&1&0\\ 0&0&0&1 \end{matrix} \right) Rz(α)=cos(α)sin(α)00sin(α)cos(α)0000100001

Eigen::Matrix4f get_model_matrix(float rotation_angle)
{
    Eigen::Matrix4f model = Eigen::Matrix4f::Identity();

    // TODO: Implement this function
    Eigen::Matrix4f rotation;
    float rot = rotation_angle/180*MY_PI;
    rotation << cos(rot), -sin(rot), 0, 0, sin(rot), cos(rot), 0, 0, 0, 0, 1,
        0, 0, 0, 0, 1;
    // Create the model matrix for rotating the triangle around the Z axis.
   	model = rotation * model;
    // Then return it.

    return model;
}

二、 投影变换

坐标的相对位置不变,光线是平行的,将物体变换到 [ − 1 , 1 ] 3 [-1,1]^3 [1,1]3的立方体中(即坐标范围为[-1,1])。

在这里插入图片描述

M o r t h o = ( 2 r − l 0 0 − r + l r − l 0 2 t − b 0 − r + b r − b 0 0 2 n − f − n + f n − f 0 0 0 1 ) M_{ortho}=\left(\begin{matrix} \frac{2}{r-l}&0&0&-\frac{r+l}{r-l}\\ 0&\frac{2}{t-b}&0&-\frac{r+b}{r-b}\\ 0&0&\frac{2}{n-f}&-\frac{n+f}{n-f}\\ 0&0&0&1 \end{matrix} \right) Mortho=rl20000tb20000nf20rlr+lrbr+bnfn+f1
M p r e s → o r t h o = ( n 0 0 0 0 n 0 0 0 0 n + f − n f 0 0 1 0 ) M_{pres \rightarrow ortho}=\left(\begin{matrix} n&0&0&0\\ 0&n&0&0\\ 0&0&n+f&-nf\\ 0&0&1&0 \end{matrix} \right) Mpresortho=n0000n0000n+f100nf0
M p r e s = M o r t h o M p r e s → o r t h o M_{pres}=M_{ ortho}M_{pres \rightarrow ortho} Mpres=MorthoMpresortho
M p r e s = ( 2 n r − l 0 l + r l − r 0 0 2 n t − b b + t b − t 0 0 0 n + f n − f − n f n − f 0 0 1 0 ) M_{pres}=\left(\begin{matrix} \frac{2n}{r-l}&0&\frac{l+r}{l-r}&0\\ 0&\frac{2n}{t-b}&\frac{b+t}{b-t}&0\\ 0&0&\frac{n+f}{n-f}&-\frac{nf}{n-f}\\ 0&0&1&0 \end{matrix} \right) Mpres=rl2n0000tb2n00lrl+rbtb+tnfn+f100nfnf0
Vertical Field of View(fovY) 是垂直可视角度
Aspect ratio是宽高比
在这里插入图片描述
-将fovYaspect转换成l,r,n,t
在这里插入图片描述
因为Z是取负方向的,所以t为负数

Eigen::Matrix4f get_projection_matrix(float eye_fov, float aspect_ratio,
                                      float zNear, float zFar)
{
    // Students will implement this function

    Eigen::Matrix4f projection = Eigen::Matrix4f::Identity();
    Eigen::Matrix4f M1,M2;
    float n = zNear;

    float t=-tan(eye_fov/180/2*MY_PI)*n;
    M1<< 1/(t*aspect_ratio),0,0,0
    ,0,1/t,0,0
    ,0,0,2/(zNear-zFar),0
    ,0,0,0,1;
    M2<< 1,0,0,0,0,1,0,0,0,0,1,-(zNear+zFar)/2,0,0,0,1;
    // TODO: Implement this function
    Eigen::Matrix4f pro;
    pro << zNear,0,0,0,0,zNear,0,0,0,0,zNear-zFar,-zNear*zFar,0,0,1,0;
    // Create the projection matrix for the given parameters.
    // Then return it.
    Eigen::Matrix4f Mortho=M1*M2;
    projection = Mortho*pro*projection;
    return projection;
}

结果如下图:
在这里插入图片描述

绕任意轴旋转

R ( n , α ) = c o s ( α ) I + ( 1 − c o s ( α ) ) n n T + s i n ( α ) ( 0 − n z n y n z 0 − n x − n y n x 0 ) R(n,\alpha)=cos(\alpha)I+(1-cos(\alpha))nn^T+sin(\alpha)\left(\begin{matrix} 0&-n_z&n_y\\ n_z&0&-n_x\\ -n_y&n_x&0\\ \end{matrix} \right) R(n,α)=cos(α)I+(1cos(α))nnT+sin(α)0nznynz0nxnynx0
[5]

Eigen::Matrix4f get_model_matrix_axis(float rotation_angle,Eigen::Vector3f axis_start,Eigen::Vector3f axis_end)
{
    Eigen::Matrix4f model = Eigen::Matrix4f::Identity();

    // TODO: Implement this function
    Eigen::Matrix4f rotation  = Eigen::Matrix4f::Identity();;

    Eigen::Vector3f axis;

	for(int i=0;i<3;i++){
		axis[i] = axis_end[i] - axis_start[i];
	}

	Eigen::Vector3f axisNorm = axis.normalized();
	

    float rot = rotation_angle/180*MY_PI;
    Eigen::Matrix3f n(3,3);
     n<< 0,-axisNorm[2],axisNorm[1],
     	axisNorm[2],0,-axisNorm[0],
     	-axisNorm[1],axisNorm[0],0;

     Eigen::Matrix3f c1 = Eigen::Matrix3f::Identity() *cos(rot);
     Eigen::Matrix3f c2 = axisNorm*axisNorm.transpose() *(1-cos(rot));
    Eigen::Matrix3f c3 =  sin(rot) * n;
    // Create the model matrix for rotating the triangle around the Z axis.
    rotation.block(0,0,3,3) = c1+c2+c3;
  /*  Eigen::AngleAxisf  rotation_vector(rot,Eigen::Vector3f(axisNorm[0],axisNorm[1],axisNorm[2]));
rotation.block(0,0,3,3) = rotation_vector.toRotationMatrix();*/

  
   	model = rotation * model;
    // Then return it.

    return model;
}

三、总结

只实现基本要求,根据课程ppt还是比较容易实现的。
绕任意轴是看别人写的,公式以后还是要自己证明一下,不然感觉还是有点不理解,很难写出来。

四、参考和引用

[1] bilibili:GAMES101-现代计算机图形学入门-闫令琪
[2] 变换(二维与三维).pdf
[3] 变换(模型、视图、投影).pdf
[4] 罗德里格斯公式证明.pdf
[5] CSDN:GAMES101-现代计算机图形学学习笔记(作业01)
[6] GAMES101-现代计算机图形学作业链接

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Game101现代计算机图形学作业1 的相关文章

  • Game101课程笔记_lecture10_几何

    Game101课程笔记 lecture10 几何 1 纹理应用 1 环境光 环境贴图 2 凹凸贴图 法线贴图 1 Bump Mapping 3 位移贴图 4 三维纹理 5 环境光遮蔽 6 体渲染3D Texture and Volume R
  • 高等数学——驻点,拐点,极值点

    一 定义不同 1 极值点 若f a 是函数f x 的极大值或极小值 则a为函数f x 的极值点 极大值点与极小值点统称为极值点 极值点是函数图像的某段子区间内上极大值或者极小值点的横坐标 极值点出现在函数的驻点 导数为0的点 或不可导点处
  • (邱维声)高等代数课程笔记:极大线性无关组,向量组的秩

    极大线性无关组 向量组的秩 quad 一般地 设 V V V 是数域 K K K 上的一个线性空间
  • 宋浩线性代数笔记(五)矩阵的对角化

    本章的知识点难度和重要程度都是线代中当之无愧的T0级 对于各种杂碎的知识点 多做题 复盘才能良好的掌握 良好掌握的关键点在于 所谓的性质A与性质B 是谁推导得谁
  • 【线性代数】第一章 1.3逆矩阵

    上一篇 1 2 高斯消元法与矩阵的初等变换 目录 一 逆矩阵的概念与性质 二 用行初等变换求逆矩阵 一 逆矩阵的概念与性质 前面我们定义了矩阵的加法 减法和乘法三种运算 自然的 欲在矩阵中引入类似于除法的概念 其关键在于引入类似于倒数的概念
  • Game101现代计算机图形学入门学习笔记(七)

    光线追踪 一 光线追踪 1 为什么要使用光线追踪 二 基础光线追踪算法 1 光线 2 光线投射 1 着色过程 3 递归光线追踪 Whitted Style 1 基本过程 2 光线 表面相交 1 光线方程 3 轴对称包围盒 AABB 1 Un
  • GAMES101:作业3

    GAMES101 作业3 附其他所有作业超链接如下 Games101 作业0 作业0 Games101 作业1 作业1 Games101 作业2 作业2 Games101 作业3 作业3 Games101 作业4 作业4 Games101
  • 【翻译】Dagre-D3 文档整理和翻译

    地址 github Dagre D3 目录 文章目录 dagre d3 设计优先级 安装 npm Bower Browser Scripts 源代码构建 如何使用Darge 聚焦渲染 例子 配置布局 生成的图像 第三部分例子 推荐阅读 da
  • 线性代数---之正交向量

    转载 百度百科 正交向量 编辑 本词条由 科普中国 百科科学词条编写与应用工作项目审核 正交向量 是一个数学术语 指点积为零的两个或多个向量 几何向量的概念在 线性代数中经由抽象化 得到更一般的向量概念 此处向量定义为 向量空间的元素 要注
  • 2022年第十四届华中杯数学建模A题解题思路附代码

    A 题 分拣系统优化问题 某电商公司配送中心的工作流程分为统计汇总 转运上架 按订单分拣 核对打包等 步骤 其中 分拣环节操作复杂 耗时较长 其效率是影响配送中心整体性能的关键因素 首先 系统统计汇总出当天全部待配送订单所包含的所有货品及相
  • 【论文笔记】基于Control Barrier Function的二次规划(QP)控制

    文章目录 写在前面 问题描述 RBF 1 Logarithmic 2 Inverse type 3 Reciprocal ZBF 两者的联系 CBF构建 RCBF ZCBF QP设计 ES CLF CLF CBF QP 写在前面 原论文 C
  • 图谱论学习—拉普拉斯矩阵背后的含义

    目录 一 为什么学习拉普拉斯矩阵 二 拉普拉斯矩阵的定义与性质 三 拉普拉斯矩阵的推导与意义 3 1 梯度 散度与拉普拉斯算子 3 2 从拉普拉斯算子到拉普拉斯矩阵 一 为什么学习拉普拉斯矩阵 早期 很多图神经网络的概念是基于图信号分析或图
  • 问题 D: 稀疏矩阵类型判断

    题目描述 输入一个稀疏矩阵 输出其类型 类型包括 上三角 对角线及其右上方的元素非0 其它元素为0 下三角 对角线及其左下方的元素非0 其它元素为0 对称 沿对角线对称的元素非0且相等 空矩阵 所有元素都为0 其它为普通矩阵 输入 输入包括
  • 提取任务相关成分的TRCA算法

    提取任务相关成分的TRCA算法 1 TRCA算法简介 2 TRCA算法原理与推导 3 Ensemble TRCA算法原理简介 1 TRCA算法简介 虽然基于CCA的方法在识别SSVEP信号方面具有不错的表现 但这类方法的性能仍旧易受到自发脑
  • 密码复习——AES

    AES 分组加密 明文的固定长度128位 密钥长度可以是128 192 256位 按明文与密钥长度都是128位来解释AES的加密过程 在AES中 明文是以字节的形式排列 一个字节8bit位 排列如下 AES的整体加密流程 其中最后一轮第十轮
  • GPU编程 CUDA C++ 线性代数求解器 cuSolver库

    cuSolver库较cuBLAS库更为高级 其能处理矩阵求逆 矩阵对角化 矩阵分解 特征值计算等问题 cuSolver库的实现是基于cuBLAS库和cuSPARSE库这两个基本库 cuSolver库的功能类似于Fortran中的LAPACK
  • 矩阵的分解——LU分解

    LU分解 LU分解是矩阵分解的一种 将一个矩阵分解为一个下三角矩阵和一个上三角矩阵的乘积 有时需要再乘上一个置换矩阵 LU分解可以被视为高斯消元法的矩阵形式 在数值计算上 LU分解经常被用来解线性方程组 且在求逆矩阵和计算行列式中都是一个关
  • TechWiz LCD 2D应用:多畴IPS仿真

    1 建模任务 1 1 模拟条件 模拟区域 0 10 边界条件 Periodic 偏移角度 12 Domain A 12 Domain B 单位长度 0 5
  • MIT_线性代数笔记:第 23 讲 微分方程和 exp(At)

    目录 微分方程 Differential equations 矩阵指数函数 Matrix exponential e A t e At
  • 5_机械臂运动学基础_矩阵

    上次说的向量空间是为矩阵服务的 1 学科回顾 从科技实践中来的数学问题无非分为两类 一类是线性问题 一类是非线性问题 线性问题是研究最久 理论最完善的 而非线性问题则可以在一定基础上转化为线性问题求解 线性变换 数域 F 上线性空间V中的变

随机推荐

  • phpstrom、laradock、xdebug 进行断点调试

    phpstrom laradock xdebug 进行断点调试 背景 laravel 框架封装太完善 经常搞不明白究竟用的是哪个类 复杂一点的算法 使用 dd方法调试时 需要疯狂dd 显得过于鸡肋 调试流程 发请求 跑调试代码 安装 xde
  • 决策树之用信息增益选择最优特征

    决策树之用信息增益选择最优特征 熵 熵的定义 熵 sh ng 热力学中表征物质状态的参量之一 用符号S表示 其物理意义是体系混乱程度的度量 在决策树中 信息增益是由熵构建而成 表示的是 随机变量的不确定性 不确定性越大 代表着熵越大 随机变
  • Mycat 学习小结

    Mycat 学习小结 Mycat 是什么 Mycat 是一个彻底开源的面向企业应用开发的大数据库集群 支持事务 ACID 是可以替代Mysql 的加强版数据库 Mycat被视为 Mysql 集群的企业级数据库 用来替代昂贵的 Oracle
  • LuCI界面开发之CBI模块

    在openWrt路由界面的开发中 我们使用的LuCI实际上已经不是简单的html了 它是嵌合于lua语言中的元素 或者按照英文翻译来说不是那些input而是变为如asp net中使用的那些控件 或者是 类 这些类包括一些常用的input输入
  • 编程每日一题_C程序设计_判断是否为素数

    描述 给定整型数据 判断其是否为素数 质数 又称素数 是指在大于1的自然数中 除了1和它本身外 不能被其他自然数整除 除0以外 的数称之为素数 质数 比1大但不是素数的数称为合数 1和0既非素数也非合数 素数 质数 与合数 定义存疑 解法一
  • 分支-11. 计算工资(15)

    某公司员工的工资计算方法如下 一周内工作时间不超过40小时 按正常工作时间计酬 超出40小时的工作时间部分 按正常工作时间报酬的1 5倍计酬 员工按进公司时间分为新职工和老职工 进公司不少于5年的员工为老职工 5年以下的为新职工 新职工的正
  • ue5新手零基础学习教程 Unreal Engine 5 Beginner Tutorial - UE5 Starter Course

    ue5新手零基础学习教程 Unreal Engine 5 Beginner Tutorial UE5 Starter Course 教程大小解压后 4 96G 语言 英语 中英文字幕 机译 时长 4小时56分 1920X1080 mp4 虚
  • 使用 Docker 和 Alpaca LoRA 对 LLaMA 65B 大模型进行 Fine-Tune

    这篇文章中 我们来聊聊如何使用两张显卡来进行 LLaMA 65B 大模型的微调工作 以及如何在一张普通的 4090 家用显卡上 只花几个小时 就能够完成 7B 模型的微调 写在前面 在之前的几篇文章里 我们介绍过三种方式运行 Meta 开源
  • Shell脚本编写教程【七】——Shell test命令

    Shell脚本编写教程 七 Shell test命令 目录 https blog csdn net shn111 article details 131590488 参考教程 https www runoob com linux linux
  • ICCV 2023

    点击蓝字 关注我们 AI TIME欢迎每一位AI爱好者的加入 作者介绍 张耕维 悉尼科技大学在读博士生 研究方向为持续学习 报告题目 通过慢学习和分类器对齐在预训练模型上进行持续学习 内容简介 持续学习研究的目标在于提高模型利用顺序到达的数
  • windows下使用django实现定时任务

    简介 在做 弹幕弹幕 小程序后端时 需要定时清除数据库中无用的弹幕 在网上查得可以使用Django中的django apscheduler实现这一功能 我在这里记录一下使用这一Application的过程 django apschedule
  • vue封装年月日时分秒

  • case when then else_CASE 表达式

    一 语法及作用 使用CASE表达式可以帮助我们解决复杂的查询问题 相当于条件判断的函数 判断每一行是不是满足条件 CASE CASE 表达式会从对最初的WHEN子句中的 lt 求值表达式 gt 进行求值开始执行 所谓求值 就是要调查该表达式
  • STM32CubeIDE使用笔记(01):基础说明与开发流程

    文章目录 目的 基础事项 下载安装 界面说明 项目文件夹 常用快捷键 开发流程 总结 目的 STM32cubeIDE是ST官方推出的一款用于开发STM32的工具 其实就是整合了STM32CubeMX和TrueSTUDIO而成 对于STM32
  • C、C++、C#、python、java编程—数据类型的使用(二)

    四 Python 4 1字符串 1 字符串使用 var1 Hello World var2 Python Runoob print var1 0 var1 0 print var2 1 5 var2 1 5 以上实例执行结果 var1 0
  • 文本同文件一并提交的后端接口处理(一个实体类)

    出现的问题 org springframework web HttpMediaTypeNotSupportedException Content type multipart form data boundary WebKitFormBou
  • jupyter基本使用方法

    jupyter基本使用方法 菜单栏 File Edit View Insert Cell Kernel Help 工具条 单元 快捷键 菜单栏 File Edit View Insert Cell Kernel Help 工具条 单元 在M
  • 图书管理系统数据字典_2. 结构化——数据字典

    返回目录 Chilan Yuk 软件工程分析设计图库目录 zhuanlan zhihu com 一 基本知识 用于定义数据流和数据存储的结构 并给出构成所给的数据流和数据存储的各数据项的基本数据类型 数据字典中应该包括关于数据的如下信息 一
  • BUCK电路分析(二)

    BUCK电路分析 二 PSIM仿真同步BUCK电路 在上片文章中 初步的分析了BUCK电路的工作原理 本章使用PSIM软件仿真BUCK电路 观察分析BUCK电路器件关键波形 图1是同步BUCK电路图 开关频率设置为200K 固定占空比 在仿
  • Game101现代计算机图形学作业1

    Game101现代计算机图形学作业1 一 作业描述 二 解决方法 一 模型变换 二 投影变换 绕任意轴旋转 三 总结 四 参考和引用 一 作业描述 给定三维下三个点 v 0 2 0 0