透视投影

前言:图形学第四弹,透视投影!来吧,我们开始

先上图

原图


经过透视投影后的图

之前我们都是直接将图片投影到 z=0 的平面上,没有用透视投影的方法。其实不难,来,让我们开始吧。

一图解决所有问题

在之前的博客中,我们直接用的是(x, y),代替投影以后的图。学习透视投影之后,我们将计算新的(x^1, y^1)

如图由相似三角形可得

  • x^1 = \frac{x}{1-\frac{z}{c}}
  • y^1 = \frac{y}{1-\frac{z}{c}}
  • z^1 = 0

c 是相机的位置。也就是说,我们用透视投影,新的(x^1, y^1)来代替直接投影。

实现

引入线性变换(Linear transformations)

有线性代数的基础的同学可以跳过

基础线性变化

公式


比如

实现这样的变化,红绿线是数轴

旋转

公式


:)

比如

引入齐次坐标(Homogeneous coordinates)

这一点可能很多人不知道,建议看看,有助于完成后面的代码

啥是齐次坐标

所谓齐次坐标就是将一个原本是 n 维的向量用一个 n+1 维向量来表示。比如二维 [1, 2] 可表示为三维 [1, 2, 1],也可表示为 [2, 4, 2]也就是说将前面两个数除以后面那个数就可以得到二维平面的坐标。

注意!

  • 如果最后一个数字不为 0 。那么表示点
  • 如果最后一个数字为 0 。那么表示向量

为啥要用「齐次坐标」

齐次坐标的作用有很多,我也没搞透。只能举出一个应用于本次学习的例子。

齐次坐标应用在计算机图形中,可以用来计算投影。

记得我们在一开始提出的(x_1, y_1)吗?它其实是(\frac{x}{1-z/c}, \frac{y}{1-z/c})而且,在我们的模型中,他其实是还有 z 的值。这个 z 值有关于我们之前 3d 到 2d 的转换

通过齐次坐标,我们可以用[x, y, z, 1-z/c]表示我们新的坐标

代码

GitHub

最后实现渲染器的代码

运行

$ g++ tgaimage.cpp model.cpp geometry.cpp main.cpp -o main

参考

这是大神

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 摘要:透视投影是3D渲染的基本概念,也是3D程序设计的基础。掌握透视投影的原理对于深入理解其他3D渲染管线具有重要...
    予汐阅读 5,092评论 0 2
  • transform的结构如下:struct CATransform3D{CGFloat m11, m12, m13...
    wzf_taker阅读 5,312评论 0 0
  • “齐次坐标表示是计算机图形学的重要手段之一,它既能够用来明确区分向量和点,同时也更易用于进行仿射(线性)几何变换。...
    Supreme_DJK阅读 2,350评论 0 0
  • 概述 在3D图形:矩阵与线性变换中,曾经简单的说过关于正交投影和透视投影的简单区别,这一篇博客将对透视投影做进一步...
    神经骚栋阅读 9,534评论 10 15
  • What's your malfunction with you!你有毛病啊! ...
    刘佳玲pp阅读 1,618评论 0 0