计算机图形学 大作业
5090379126
虞文豪
题目:通过光照及纹理映射,实现高度真实感青花瓷材质的
茶壶向茶杯倒水动画特效。
一. 概述
之前的作业用使用SPH 方法做了一个水流的模拟程序,这次作业在上次
作业的基础上增加了渲染的部分,对SPH 的一些参数以及碰撞检测进行了一
些小的调整。
这次大作业中主完成了的功能有:
1. 建立背景平面
2. 实现茶壶拿起的动画
3. 水蒸汽效果
4. 青花瓷材质
5. 茶壶与茶杯的环境映射及环境映射与纹理叠加
6. 水流的半透明与折射效果
二. 实现
1. 建立背景平面
在第一次作业中我使用3DMAX 做了一个简易的小房间,这次作业中为小房间内的东西
添加了纹理贴图使得房间看起来更加美观与真实。
背景房间:
2. 实现茶壶拿起的动画
茶壶动画的实现通过两个数组来完成,一个数组表明一系列的茶壶位置变化向量,另一
个数组表明一系列的茶壶旋转弧度,这里的旋转是沿着z 轴进行的,因为茶壶在被拿起过程
中可以认为另两个方向是不转的。
倒水中的茶壶:
3. 水蒸汽效果
这次作业中实现了一个粒子系统来模拟水蒸汽的效果。粒子系统中的每个粒子具有生命、
速度、位置、旋转、大小等属性。
粒子的生命每帧减少。粒子的速度在X 与Z 方向递减,在Y 方向有少量递增,这样保证
了粒子总体是往上移动的,粒子的初始速度随机。每次更新时,粒子会获得一个随机的少量
旋转来增加一些动态。每个粒子初始大小随机,随着时间流逝粒子会先达到最大的大小,然
后开始缩小,在粒子死亡时大小接近于0 。
粒子的渲染使用了一个小立方体,然后通过OPENGL 的blend 以及depthmask 来创造粒
子密的地方颜色浓,粒子稀的地方颜色淡的效果。
蒸汽效果:
4. 青花瓷材质
青花瓷材质的制作是从网上找了一张青花瓷的贴图,然后把茶壶与茶杯的模型放到
3DMAX 中,再用uvw 展开调整贴图的位置使得模型更像一个青花瓷制品。
青花瓷材质:
5. 茶壶与茶杯的环境映射及环境映射与纹理叠加
茶壶与茶杯的环境映射通过使用OPENGL 的CUBE MAP 实现,由于我的场景不是现有的
六面场景而是一个房间模型,因此我通过手动设置以及截图,把场景的六个方向分别进行了
截图构成了CUBE MAP 的六个面。
在绘制茶壶与茶杯前在OPENGL 的纹理矩阵中对CUBE MAP 纹理进行了旋转以配合当前
的视角。
环境映射与纹理的叠加使用了ALPHA 和BLEND 来实现。在读取CUBE MAP 的六张图片
时,通过手动修改图片数据,将图片从原本的24 位 RGB 格式改为32 位 RGBA 格式,并把
Alphs 位赋为90 。然后在同样的位置,画一个比之前稍大一点的茶壶(茶杯) 。这里的做法是
把所有节点都向法向量移动一点点。设置适当的blend 函数。这样就能把环境映射和茶壶(杯)
的纹理很好地结合起来。
环境映射:
结合后效果:
6. 水流的半透明与折射效果
水流的渲染是通过render to texture 以及cg,即c for graphics 这样一个gpu 编程语言来
做的。它本来自带了一个 refract 函数用以计算折射,但是它更适合六面背景中的一滩水,
而不是装在不透明容器中的水,而且由于我的cube map 颜色比较杂,试了这个方法以后发
现效果很不好,因此这里参考
/presentations/2010/gdc/Direct3D_Effects.pdf 进行了实
现,但是由于实现过程中遇到不少问题,因此只是参考了其中的几个步骤,而不是完全实现
了文章,因此效果也有差异。
水流渲染中用到了5 个纹理缓存,分别用来储存:背景、水流mask、水流的法向图以
及水流的厚度图,还用到了3 组cg 写的shader 进行处理。