本发明属于图像处理技术领域,具体而言,涉及一种实现逐像素光照运算的方法。
背景技术:
目前,大多数3d软件和游戏引擎都支持obj文件的读写。obj文件是一种标准3d模型文件格式,常用于3d软件模型之间的互导。比如在3dsmax或lightwave中建立一个模型,需要将它调到maya里面进行渲染或动画,可以通过导出obj格式文件实现。obj文件是一种文本文件格式,比起二进制文件为主、用途块需要反复探索的3ds,文本文件为主的obj更利于提升开发者的工作效率。
计算光照效果是现在3d渲染的必备环节。obj文件可以支持顶点光照运算,但该效果比较粗糙,无法表达细腻的效果和逼真的表现,实际应用中该运算很少被使用几乎被淘汰。想要通过光照表现出模型表面的凹凸质感,并且做到逼真的表现,则必须使用逐像素光照运算。然而,由于obj文件缺少逐像素光照运算所需的数据,无法通过逐像素做光照运算得到细腻和逼真的3d图像。
技术实现要素:
针对上述问题,本发明的目的在于提供一种实现逐像素光照运算的方法。
技术方案如下:
一种实现逐像素光照运算的方法,其特征在于,
步骤一、将原始数据以三角面为对象存放;
步骤二、计算得到顶点切线空间坐标;
步骤三、以obj格式存储数据。
具体的,上述实现逐像素光照运算的方法,其特征在于,步骤一、将原始数据以三角面为对象存放,面对象包括三个顶点对象,顶点对象包括:纹理坐标、索引、原索引、法线、切线。
更具体的,上述实现逐像素光照运算的方法,其特征在于,步骤二、计算得到顶点切线空间坐标,包括步骤:
1)根据面整理顶点数据和索引;
2)计算顶点法线;
3)计算切线空间。
更具体的,上述实现逐像素光照运算的方法,其特征在于,1)根据面整理顶点数据和索引中,对每个三角面单独计算;如果有顶点重复出现在多个面中,拆分成新的顶点,通过自动递增赋予新的顶点索引,而纹理坐标直接复制原值。
更具体的,上述实现逐像素光照运算的方法,其特征在于,2)计算顶点法线:
a)为每个面计算法线,以面法线作为顶点的初始法线:
顶点坐标v0,v1,v2,
向量v01=v1–v0,向量v02=v2–v0,
法线n=cross(v01,v02);
b)对顶点坐标相同的顶点的法线做平均值,作为实际法线值。
更具体的,上述实现逐像素光照运算的方法,其特征在于,3)计算切线空间:
a)顶点坐标v0,v1,v2,纹理坐标c0,c1,c2;
b)向量v01=v1–v0与向量c01=c1–c0=(u1-u0,v1-v0)=(u01,v01)方向一致;向量v02=v2–v0与向量c02=c2–c0=(u2-u0,v2-v0)=(u02,v02)方向一致;
c)t轴,b轴分别和纹理坐标轴u,v是平行的:v01=u01*t+v01*b,v02=u02*t+v02*b;
n轴由t轴和b轴叉乘得到:n=cross(t,b);
t、b、n就是切线空间坐标值。
具体的,上述实现逐像素光照运算的方法,其特征在于,步骤三、以obj格式存储数据,包括:
1)输出顶点,“vxyz”以该格式为一行存贮一个顶点坐标,xyz为坐标值使用浮点数,小数点后保存6位;
2)输出顶点纹理坐标,“vtxyz”以该格式为一行存贮一个顶点纹理坐标,xyz为纹理坐标值使用浮点数,小数点后保存6位;
3)输出顶点法线坐标,“vnxyz”以该格式为一行存贮一个顶点法线坐标,xyz为纹理坐标值使用浮点数,小数点后保存6位;
4)输出顶点切线空间坐标,“tgxyz”以该格式为一行存贮一个顶点切线空间坐标,xyz为纹理坐标值使用浮点数,小数点后保存6位;
5)输出面索引,“fv/vt/vnv/vt/vnv/vt/vn”以该格式为一行存贮一个面的顶点索引,v为顶点坐标的索引,vt为纹理坐标索引,vn为法线坐标索引,索引值使用整数。
本发明所取得的技术效果在于:
3d建模软件,比如3dsmax都可以自己编写插件或脚本导出自己所需的数据。因此只需要自己计算顶点的切线空间坐标并导出(亦按照obj文件数据格式),其余数据均按照obj文件的格式导出即可。该文件可支持逐像素光照运算,并且兼容现有的obj文件格式,用3d软件按obj文件加载该文件不会有大的错误。
附图说明
图1为具体实施整体流程图。
图2为法线坐标计算流程图。
图3为切线空间坐标计算流程图。
具体实施方式
为使本领域的技术人员更好地理解本发明的技术方案,下面结合具体实施例对本发明提供的实现逐像素光照运算的方法进行详细描述。
作为obj文件想要支持逐像素光照计算,只需增加一种数据:顶点切线空间坐标。大部分3d建模软件,比如3dsmax都可以自己编写插件或脚本导出自己所需的数据。因此只需要自己计算顶点的切线空间坐标并导出(亦按照obj文件数据格式),其余数据均按照obj文件的格式导出即可。
具体实施例:
将原始数据以三角面为对象存放,面对象的成员包括三个顶点对象,顶点对象的成员包括纹理坐标、索引、原索引、法线、切线。
一、按面整理顶点数据和索引
由于需要对每个三角面单独计算,因此如果有顶点重复出现在多个面中需要拆分成新的顶点,并赋予新的顶点索引(自动递增),而纹理坐标直接复制原值。
二、计算顶点法线
1、为每个面计算法线,以面法线作为顶点的初始法线。
顶点坐标v0,v1,v2,向量v01=v1–v0,向量v02=v2–v0;
法线n=cross(v01,v02)
2、对顶点坐标相同的顶点的法线做平均值,作为实际法线值
三、计算切线空间
1、顶点坐标v0,v1,v2,纹理坐标c0,c1,c2。
2、向量v01=v1–v0与向量c01=c1–c0=(u1-u0,v1-v0)=(u01,v01)方向一致;向量v02=v2–v0与向量c02=c2–c0=(u2-u0,v2-v0)=(u02,v02)方向一致。
3、t,b分别和纹理坐标轴u,v是平行的。那么,v01=u01*t+v01*b;v02=u02*t+v02*b;
最终的变换形式:
而n轴可以由两轴叉乘得到:n=cross(t,b);
t、b、n就是切线空间坐标值。
四、将数据写入文件
文件格式完全按照obj文件的标准来:
1、输出顶点,“vxyz”以该格式为一行存贮一个顶点坐标,xyz为坐标值使用浮点数,小数点后保存6位。
2、输出顶点纹理坐标,“vtxyz”以该格式为一行存贮一个顶点纹理坐标,xyz为纹理坐标值使用浮点数,小数点后保存6位。
3、输出顶点法线坐标,“vnxyz”以该格式为一行存贮一个顶点法线坐标,xyz为纹理坐标值使用浮点数,小数点后保存6位。
4、输出顶点切线空间坐标,“tgxyz”以该格式为一行存贮一个顶点切线空间坐标,xyz为纹理坐标值使用浮点数,小数点后保存6位。
5、输出面索引,“fv/vt/vnv/vt/vnv/vt/vn”以该格式为一行存贮一个面(3个顶点)的顶点索引,v为顶点坐标的索引,vt为纹理坐标索引,vn为法线坐标1、索引,索引值使用整数。
6、按具体需求可以输出其他obj文件支持的非主要数据。
以上方法的实施以如下代码段为例:
可以理解的是,以上实施方式仅仅是为了说明本发明的原理而采用的示例性实施方式,然而本发明并不局限于此。对于本领域内的普通技术人员而言,在不脱离本发明的精神和实质的情况下,可以做出各种变化和改进,这些变化和改进也视为本发明的保护范围。