旋转矩阵&&一些感想
之前傻不拉几地把单个轴的旋转矩阵点乘需要旋转的物体,结果就导致在动画机里边旋转就会出现下面链接里这样的情况
Help Wanted - How can the shader property be periodic like the rotation of transform? - Unity Forum
当时这个老哥(还是个工作室的)回答了我的问题,他说要我把UV变为三维,再乘以三维的齐次旋转矩阵,我以为他说的是让我把我那个单轴的旋转矩阵扩大成三维的,我当时就觉得这样不对吧,那结果不是还是一样的吗。真的一脸懵逼,但是毕竟我卡在这里,那就索性问下去,结果他干脆就不回答了。
后面我就不用角度这个变量控制旋转了,我直接用坐标来间接控制角度(毕竟动画机里边也是坐标的形式实现的动画过度),自己研究了区分四象限的算法,虽然不知道我的算法有没有前人研究过,但确实是我自己想出来的,没有查资料。
最近在学草地,就发现有这么一个矩阵可以用来控制草的旋转
float3x3 AngleAxis3x3(float angle, float3 axis) { float c, s; sincos(angle, s, c); float t =1-c; float x = axis.x; float y = axis.y; float z = axis.z ; return float3x3( t* x* x + c, t * x * y - s * z, t * x * z + s * y, t * x * y + s * z, t * y * y + c, t * y * z - s * x, t * x * z - s * y, t * y * z + s * x, t * z * z + c ); }
就不免想到我一星期前做的东西,说不定也可以用这个函数来实现,结果一试还真的可以,不会出现原来那种折返的情况。
“啊,会不会这个矩阵就是那个老哥说的三维齐次旋转矩阵?”
我当时不知道啊
//2023.11.22update
一年多过去了,对于旋转了解的还是比较少,目前项目里面最近也用到了旋转相关的内容——
我们的需求是这样的:提供了一棵树的贴图以及一些树上水果贴图,如何制作一个摇晃树木并掉下水果的动画
对于这样的二维项目,一开始想到的是用粒子,但是考虑到粒子做摇晃不太容易,虽然粒子做随机很方便,但是他并不好实现单个果实的掉落效果,也尝试过脚本来控制旋转,但是考虑到摇晃是越高晃动越厉害,脚本不好插值
所以我最后采用的是shader+script的方式,使用quad作为基本模型进行制作
①树的摇晃容易,其原理就是以uv坐标(0.5,0)作为旋转锚点,以uv.y作为插值的参数(防止树木根部晃动)控制旋转强度,代码如下
fixed degrees2radius = radians(sin(_frequency * _Time.z) * _amplitude); fixed2x2 rot = fixed2x2(cos(degrees2radius), sin(degrees2radius), -sin(degrees2radius), cos(degrees2radius)); fixed2 mainuv = TRANSFORM_TEX(i.uv, _MainTex); fixed2 uvrotatecenter = fixed2(0.5, 1); fixed2 rotmainuv = mul(mainuv.xy - uvrotatecenter, rot); fixed2 rotmainuvfin = rotmainuv + uvrotatecenter; fixed4 col = tex2D(_MainTex, rotmainuvfin);
②树上的果子的话比较难模拟,主要问题在于:如何
//2024-06-17 该方案已废弃,原因是因为有更好的方式,这种方案只能当作一个练习