前几天在解决公司一个项目时候,遇到个扭曲算法问题,图像扭曲在DX或者OPENGL中非常容易实现,只需要修改uv坐标或者修改顶点坐标就行了,至于怎么扭曲全部交给DX,OPENGL了.这次得自己写内部算法的细节.
2d/3d中一般都是使用矩阵来控制图形变换,不过之前的变换都是标准的变换,也就是不管怎么缩放旋转极坐标系始终是垂直的,可是扭曲就不一样了,极坐标系还有不垂直的情况.先直接套用仿射矩阵,结果输出的图是错的,难道仿射矩阵不适用于扭曲? 后来查了资料,发现原来还是我矩阵极坐标系弄错了
以前使用引擎时候,输出效果不对,直接转置一下,在输出看看效果,这次居然给忘记了.
如图,三角形从左往右变换
可以设
B为坐标系原点, BC为x轴, BA为y轴
根据公式
(AxisX.x AxisX.y 0)
(u v 1) x (AxisY.x AxisY.y 0) = (x y 1)
(0 0 1)
AxisX就是向量BC,AxisY就是向量BA
由于uv是一个权重值,在变换过程中是不会发生变化的
所以只需要先算出三角形1的uv值, 再把uv带入三角形2种,就能得到x' y' . 扭曲的核心算法也就完成了.
直接上最终效果图
原图:
扭曲后: