旋转矩阵&&一些感想

之前傻不拉几地把单个轴的旋转矩阵点乘需要旋转的物体,结果就导致在动画机里边旋转就会出现下面链接里这样的情况

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  该方案已废弃,原因是因为有更好的方式,这种方案只能当作一个练习

posted @ 2022-03-30 11:34  terrificia  阅读(31)  评论(0编辑  收藏  举报