图形学学习笔记#2:明暗着色
概述
理论上来说,正确的明暗处理需要全局的计算,但这样与流水线模型的处理方式相悖,所以我们处理光照的时候应该用局部光照来对全局光照进行逼近。
光线从光源表面离开有两种方式: 自发射 和 反射 。这两种方式从光源表面一点 (x, y, z) 离开时均可用发射方向 (θ,φ)(\theta, \varphi)(θ,φ) 与波长 λ\lambdaλ 来进行表示:照明函数 I(x,y,z,θ,φ,λ)I(x, y, z, \theta, \varphi, \lambda)I(x,y,z,θ,φ,λ) 。
一个光源能发射出不同量的不同频率的光,其方向都有可能不同,所以对其进行计算的时候要用RGB三种成分进行分别计算,由此可以得知光亮度函数 L=[Lr,Lg,Lb]L=[L_r, L_g, L_b]L=[Lr,Lg,Lb] 。
光源
光源的亮度函数都要分成RGB三种成分分别计算,下文不再赘述,直接给出通用的计算方法。
点光源
若从点 p0p_0p0 发出点光源,照射到一点 ppp ,则在该点接收到的光强与距离的平方成反比。
L(p,p0)=1∣p−p0∣2L(p0)L(p,p_0)= ...
浅谈基于unity与face++实现的人脸检测程序
其实这只是这周的一个小作业,实现思路挺简单的,本以为很快就能做完,但万万没想到中间踩了这么多坑,最后花了接近10小时才实现基础功能,甚至连UI都还来不及设计……
既然这些坑我能精确踩中,其他人或许也很难避开。我就在这里浅谈一下这个小程序的技术实现以及容易踩的坑吧~
实现思路
我们知道,face++的api需要我们提供一个图片文件及相关参数,然后会返回给我们一个json对象。那么这个程序的核心问题就是要如何获取那个图片文件以及处理接收到的json对象了。
根据老师的要求,我们是要使用unity调用PC摄像头来获取那张图片。这部分有两种解决思路:每过一段时间动态截取,实现实时检测的效果;或是设计一个拍照按钮,由用户来手动截取。其实两者都可以实现,但考虑到网络延迟不好把控,以及我们是使用免费的api,不清楚有没有数量的限制,我个人还是选用了后者。
于是最终的实现思路便是:
调用摄像头→获取用户图像→调用api→接收返回的json对象→对检测到的每个人脸进行处理 。
OK,有了思路,一切就都变得简单了,接下来我们逐一进行完成。
具体实现
调用摄像头
1234567891011121314 ...
图形学学习笔记#1:变换
又开了一个新坑,这次聊一聊计算机图形学。
虽然这门课我十分喜欢,上课时也听得津津有味,但无奈知识点实在太多,有点难以记全,所以仔细思索后还是通过笔记的形式记录下来。这次的笔记就不像之前的XML与数据结构那么系统化了,想到啥就写啥吧。
接下来的内容会涉及很多 线性代数 的内容,大家务必带上线性代数的基本功再一同上车~
图形学中比较重要的一个概念就是变换了,不论是模型变换、视图变换还是投影变换,其基本思路都是矩阵运算的变换,所以接下来的内容都以矩阵变换为主,较为简单的我便一笔带过,偶尔几个比较麻烦的会稍微进行解释。
模型变换
在聊模型变换之前,我们先讲一讲坐标的表示,一般情况下我们是用三维的齐次坐标来表示一个点,如
[xyz]T\begin{bmatrix}
x & y & z
\end{bmatrix}^{T}
[xyz]T
但在这里,我们需要将其扩展为四维的齐次坐标,变成 [xyz1]T\begin{bmatrix}x & y & z & 1\end{bmatrix}^{T}[xyz1]T 或 [xyz0]T\begin{bma ...
wizard:游戏设计课cocos学习记录
👇
Gitee最近暂停服务 没法进入
项目预览: 电脑端 | 手机端
👆
电脑端不定期更新吧,手机端看心情更新。反正也没啥东西hhhh,就是自己瞎玩。
这篇post的评论区就不关闭咯,大家可以一起讨论讨论cocos,想交流实验作业的一些问题也可以喔~
Week 1
普普通通地安装了cocos,毕竟之前玩过一会unity,混一混就过去了。
Week 2
做的是登录UI,都是些基础控件的使用,没啥难度,又混过去了。
Week 3
手写重力掉落和背景滚动,老师没给代码结果一堆人写不出来,还好之前玩过js,cocos用的是ts,又是混一混就过去了。只是想知道为什么重力要手写,cocos应该有刚体吧……
Week 4
学习了触摸及鼠标点击事件,老师给的代码又一次出错了,花了三个小时才找到问题之所在。也因此加深了对 getLocation() 和 getUILocation() 的理解……
Week 5
完成了玩家动画,并且手写了个状态机。原来状态机是这样的,长见识了……感觉cocos的动画编辑器还是挺好用的,除了交互不太友好以外都挺ok,比某些功能好多了。
Week 6
预制 ...
使用OpenGL读取ply文件并构建模型
由于我也是图形学初学者,所以文章中难免出现错误,望大家及时指正。
这周老师布置了个读取ply文件并显示出模型的作业,说实话对于我这个连上周画正方体作业都完成得吃力的初学者来说极其不友好。
所幸现在是假期,时间多到足以随便挥霍。花了六七个小时,最终总算是实现了基本的需求,也就是文章封面那张图。虽然看起来还是十分粗糙,但也已经尽力了。
接下来分享一下我个人构建这个立体图形的方法,用以应付这第六周的计图作业。
1.ply文件
首先来简单介绍一下ply文件。
很显然,这是一种模型文件。所以win10系统默认是由模型查看器来打开,要读取其源码需右键,并手动选择记事本或其他阅读器来浏览。
以这次作业的模型为例,打开后会发现其是一个拥有十几万行数据的大型文件,后面的数据我们可以先不用管,先聚焦到一眼看过去就十分规整的前13行:
12345678910111213plyformat ascii 1.0comment VCGLIB generatedelement vertex 37702property float xproperty float yproperty float zproperty ...
贰零贰零
...
无主之地3:一场荒谬而又爽快的狩猎
第一次接触无主之地这个系列的时候还是在高考完的那个假期的结尾。
经过了一整个夏天的狂欢,早已将账户中大多数游戏通关的我被某位好友连蒙带骗地购入了 [无主之地2],本来说好要一起联机推剧情,但这兄弟明显之前偷偷玩过,当我还是1级的时候他就已经12级,这让我怎么玩?于是我一气之下卸载了游戏,将其打入冷宫。
至此,无主之地系列在我脑海中残余的印象只有:奇怪的美漫画风,抽象的繁中翻译,不明所以的剧情,以及还算不错的联机环境(当时不开加速器也能保持50ms以内的延迟)。在这之后的半年,我一直不明白无主之地2怎么会有如此高的评价,都是两只手一杆枪,我为什么不去玩求生之路?
无主之地2
半年后的那个寒假。
刚浑浑噩噩地度过了大学的第一个学期,荣幸地拿下了全宿舍成绩最差这个名号的我,回到家后为了不读书,甚至愿意找垃圾游戏来玩,于是,我又一次打开了无主之地2。
这一次算是从头玩起,从此再也无法自拔,每天废寝忘食地肝剧情,总算领会了无主之地系列的精髓,从此坠入了无主之地这个大坑……
(当时打完一周目写的笔记👇)
可惜无主3过于昂贵,我始终不舍得购入……于是在那年暑假又将无主2升级为超级豪华版,用新角 ...
概统复习笔记(4~9章)
概统好难
离散数学知识点笔记
一些零零散散的知识点,我记不住,好记性不如烂笔头。
数据结构算法笔记#5.3:排序(3)
堆排序和树形选择排序(锦标赛排序)都是运用了二叉树的思想,将时间复杂度压到 O(nlogn) 。
堆排序
堆
在介绍堆排序之前,我先介绍一下堆。堆分为 小顶堆 和 大顶堆 ,一个小顶堆需要满足以下条件:
是一棵 完全二叉树
每个结点的值一定小于它的两个子结点
而大顶堆则与之相对,是一棵每个结点的值都大于它两个子结点的完全二叉树。
很显然,一个小顶堆的根结点一定是整个堆的最小值,而大顶堆的根结点一定是最大值。
要获得 升序 序列,我们需要构造一个 大顶堆 ;降序序列则相反。(先记着,学完后就知道为什么了)
堆排序
我们如果将堆按顺序存在数组里(索引从0开始),那么对于结点 arr[i] ,其子结点就分别为 arr[2*i+1] 和 arr[2*i+2] (自己画个图推导一下就知道了)。
友情提醒
对于某些数据结构教材,数组的第0位是不存放数据的,索引从1开始,这时子结点就应该是 arr[2*i] 和 arr[2*i+1]
对于一个杂乱的数组,我们要将其构造为大顶堆,第一次当然要自下而上针对所有结点调整一次:针对每个结点,将其与子结点中较大的进行判断,若比其本身小,自然符合规 ...