tinyrenderer-移动镜头

news2024/12/25 0:00:52

同一个点的坐标在不同基坐标系中转换

设 (O, i,j,k)坐标系中点P坐标为
在这里插入图片描述
假设基坐标(i,j,k)与(i’,j’,k’)的转换关系为
在这里插入图片描述
在这里插入图片描述
如图,可以看出
在这里插入图片描述
其中(x’,y’,z’)为点P在基坐标(i’,j’,k’)下的坐标,(Ox’,Oy’,Oz’)为(i’,j’,k’)坐标系原点O’在(i,j,k)坐标系中的位置
将基坐标(i’,j’,k’)转换(i,j,k)公式代入,并提出(i,j,k)
在这里插入图片描述
左右的看作在(i,j,k)坐标系下的表示,可得
在这里插入图片描述
推出(x’,y’,z’)在(i,j,k)坐标系中的位置变换公式
在这里插入图片描述
前一节的投影矩阵,摄像机是与世界空间的坐标系平行,以世界坐标的零点为观察点求得公式
在这里插入图片描述
因此要求出模型在世界空间中得坐标,如何转换到新得观察点target,并且和摄像机基坐标平行的坐标系中。

首先,有相机的位置cameraPos,相机看向的某个原点target,相机向上的朝向up,求出相机的基坐标

Vec3f z = (cameraPos - target).normalize();
Vec3f x = (up ^ z).normalize();
Vec3f y = (z ^ x).normalize();

根据前面公式,(Ox’,Oy’,Oz’)即为观察点的坐标

Matrix t = Matrix::identity(4);
t[0][3] = -target.x;
t[1][3] = -target.y;
t[2][3] = -target.z;

再求出M的逆变换,世界坐标的基坐标就是单位矩阵,所以M就是摄像机空间的基坐标构成的矩阵

矩阵的列向量通常被视为基向量,所以M为

Matrix t1 = Matrix::identity(4);
for (int i = 1; i < 3; i++) {
    t1[i][0] = x[i];
    t1[i][1] = y[i];
    t1[i][2] = z[i];
}

则世界坐标到摄像机空间坐标的变换矩阵为

t1.inverse() * t

M矩阵是正交矩阵(每列视作向量时两两垂直,切长度为1,行列相等)
把正交的向量,按列向量的形式放进一个花括号内,即组成了一个正交向量组
基向量是构成向量空间的一个向量组(坐标系),若基向量组内的向量两两正交,且向量长度均为1,则称作:标准正交基。
又因为正交矩阵的逆等于转置
所以

for (int i = 0; i < 3; i++) {
    t1[0][i] = x[i];
    t1[1][i] = y[i];
    t1[2][i] = z[i];
}
return t1 * t;

投影矩阵的c为-1/z,z为摄像机到观察点的距离

projection[3][2] = -1.f / (camera - target).norm();

在这里插入图片描述
Gouraud shading根据三角形三个顶点的法线求着色,再对三角形内部点插值

auto I1 = normalcoords[0] * light_dir;
auto I2 = normalcoords[1] * light_dir;
auto I3 = normalcoords[2] * light_dir;
//...
auto c = TGAColor(255, 255, 255) * I1 * alpha + TGAColor(255, 255, 255) * I2 * beta + TGAColor(255, 255, 255) * I3 * gamma;
image.set(x, y, c);

在这里插入图片描述
项目跟随练习代码地址

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

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

相关文章

【关键字】——register在C语言中的使用

register——寄存器 了解register之前&#xff0c;应该先认识认识寄存器&#xff0c;何为寄存器&#xff1f; 在计算机中&#xff0c;数据可以存储在远程二级存储&#xff08;网盘&#xff0c;服务器&#xff09;&#xff0c;本地二级存储&#xff08;本地磁盘&#xff09;&am…

DOS学习-目录与文件应用操作经典案例-move

欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一.前言 二.使用 三.案例 一.前言 move命令不仅能够对文件或目录进行重命名&#xff0c;还可以将文件转移到用户指定的位置。 二.使用 命令格式1&#xff08;重命名&#xff09;:move …

VR直播:改变我们的直播方式,让现场触手可及

VR直播是近期比较火爆的一种直播方式&#xff0c;相信在抖音上我们都刷到过转动手机、变换视角的VR直播&#xff0c;因为形式比较新颖&#xff0c;用户的参与度比较高&#xff0c;一场直播下来用户的打赏也是较为可观的。 不仅仅在直播行业&#xff0c;在众多应用领域中&#…

ARTS Week 29

Algorithm 本周的算法题为 2413. 最小偶倍数 给你一个正整数 n &#xff0c;返回 2 和 n 的最小公倍数&#xff08;正整数&#xff09;。 示例 1&#xff1a;输入&#xff1a;n 5输出&#xff1a;10解释&#xff1a;5 和 2 的最小公倍数是 10 。 实现代码如下&#xff1a; con…

压摆率SR、增益带宽积GBP、开环增益Aol

运放的选型对运放电路的实际效果非常关键&#xff0c;一定要理解运放重要参数的概念。下面几天将对运放的选型进行系统学习并做实验 运放的压摆率&#xff08;Slew Rate&#xff0c;简称SR&#xff09;是指闭环放大器在输入为阶跃信号时&#xff0c;输出电压时间变化率的平均值…

BEVFusion的相机工作流中,图像编码之后FPN+ADP网络的作用

在BEVFusion的相机工作流中&#xff0c;图像编码之后会经过一个FPNADP的网络,那么这个结构的作用是什么呢 FPN大家都很熟悉&#xff0c;就是特征金字塔。但是这里还是贴一些来自GPT的废话 在Bird’s Eye View (BEV) 算法中使用的特征金字塔网络&#xff08;FPN, Feature Pyrami…

鸿蒙OS开发:【一次开发,多端部署】(分栏控件)

一多分栏控件 介绍 本示例分别展示了多场景下&#xff0c;一多分栏控件的响应式变化效果。 本示例分别用到了[SideBarContainer]组件与[Navigation]组件&#xff0c;对应使用场景如下&#xff1a; ABC&#xff1a;即SideBarContainer组件组合Navigation组件AC&#xff1a;S…

SSRF攻击技术

1、SSRF形成原因 SSRF(Server-Side Request Forgery:服务器端请求伪造) 是一种由攻击者构造形成由服务端发起请求的一个安全漏洞。一般情况下&#xff0c;SSRF是要目标网站的内部系统。&#xff08;因为他是从内部系统访问的&#xff0c;所有可以通过它攻击外网无法访问的内部系…

03-01-Vue组件的定义和注册

前言 我们接着上一篇文章02-Vue实例的生命周期函数 来讲。 下一篇文章 03-02-Vue组件之间的传值 什么是组件 组件&#xff1a; 组件的出现&#xff0c;就是为了拆分Vue实例的代码量的&#xff0c;能够让我们以不同的组件&#xff0c;来划分不同的功能模块&#xff0c;将来我们…

Windows安装php_ssh2扩展

一、读取PHP信息 先用phpinfo读取使用的php的版本信息 二、下载ssh2扩展 链接&#xff1a;https://windows.php.net/downloads/pecl/snaps/ssh2/1.2-dev/ 点击链接下载对应链接 三、开启扩展 下载好压缩包后&#xff0c;解压缩得到php_ssh2.dll、php_ssh2.pdb文件&#xff…

以太坊(2)——共识机制与挖矿算法

共识机制 ETH采用的是基于GHOST协议的共识机制 "GHOST"&#xff08;Greedy Heaviest-Observed Sub-Tree&#xff09;共识机制&#xff0c;它是以太坊使用的一种改进的区块链共识算法。GHOST共识机制旨在提高链的安全性和效率&#xff0c;通过考虑非主链区块的贡献&…

如何保护Kubernetes集群

2018年黑客入侵了特斯拉在亚马逊上的Kubernetes容器集群。由于该集群控制台未设置密码保护&#xff0c;黑客便得以在一个Kubernetes pod中获取到访问凭证&#xff0c;然后据此访问其网络存储桶S3&#xff0c;通过S3获取到了一些敏感数据&#xff0c;比如遥测技术&#xff0c;并…

llama-factory学习个人记录

框架、模型、数据集准备 1.llama-factory部署 # 克隆仓库 git clone https://github.com/hiyouga/LLaMA-Factory.git # 创建虚拟环境 conda create --name llama_factory python3.10 # 激活虚拟环境 conda activate llama_factory # 安装依赖 cd LLaMA-Factory pip install -…

Vue——开发前的准备和创建一个vue的工程

文章目录 前言安装 Node js1、下载node.js2、安装node.js3、查看是否安装成功 创建 vue 工程Visual Studio Code 配置目录结构 前言 本篇博客主要讲解Vue开发前的环境配置与一些说明。 安装 Node js 环境需要安装配置一个nodejs 的环境。 vue3 最低nodejs 版本要求为 15.0 1…

2024.5.1学习记录

1、代码随想录&#xff1a;贪心刷题 2、react 高级使用( hoc render、props、函数组件、serState 传送门等) 3、游山玩水

linux部署rustdesk

1.拉取RustDesk镜像 sudo docker image pull rustdesk/rustdesk-server2.启动hbbs服务 sudo docker run --name hbbs -p 21115:21115 -p 21116:21116 -p 21116:21116/udp -p 21118:21118 -v pwd:/root -td --nethost rustdesk/rustdesk-server hbbs3.启动hbbr服务 sudo dock…

sqli-labs靶场

less---11 1.求闭合字符 输入1报错说明存在注入点 存在注入点 2.查库名 使用报错注入查库名 admin” and (select 1 from (select count(*),concat(database(),floor(rand(0)*2))x from information_schema.tables group by x)y)# //floor函数报错 3.查表名 admin and upd…

一、QGroundControl地面站使用介绍

文章目录 环境功能介绍飞行视图规划视图飞机设置分析工具程序设置 连接飞机飞机设置分析工具飞行视图规划任务 总结参考 环境 QGroundControl V4.2.0PX4-Autopilot V1.3.0devGazebo 模拟无人机 功能介绍 飞行视图规划视图飞机设置分析工具程序设置 飞行视图 软件打开后为飞…

OWASP Benchmark | OWASP 基准项目介绍

1. 背景 市面上的静态代码检测SAST工具越来越多&#xff0c;除了业界比较知名的Coverity、Fortify、CheckMax&#xff0c;还有CodeQL、SonarQube、CppCheck等&#xff0c;国内也涌现了一大波检测工具&#xff0c;如鸿渐SAST、奇安信代码卫士、北大Cobot、酷德啄木鸟等&#xf…

KT142C语音芯片音量详细汇总 包含记忆 低功耗的音量_开机音量

关于KT142C语音芯片sop16的音量详细汇总&#xff0c;包含记忆&#xff0c;低功耗唤醒之后的音量&#xff0c;开机音量 芯片的音量是分为三部分&#xff0c;详见手册的“3.4.2”章节 串口发送指令设置&#xff0c;但是掉电或者进入低功耗被唤醒&#xff0c;这两种情况都会恢复到…