ShaderGraph结点分析---Twirl 和 Rotate---3

1 . Twirl(扭曲)结点:根据距离中心的点的距离旋转的幅度不一样,越远越大:官方文档

源代码:

void Unity_Twirl_float(float2 UV, float2 Center, float Strength, float2 Offset, out float2 Out)
{float2 delta = UV - Center;										//1.平移到原点float angle = Strength * length(delta);							//2.缩放到原点的距离float x = cos(angle) * delta.x - sin(angle) * delta.y;			float y = sin(angle) * delta.x + cos(angle) * delta.y;			//3.矩阵旋转:离原点越远旋转的角度越大Out = float2(x + Center.x + Offset.x, y + Center.y + Offset.y); //4.平移回去,再加上偏移值即可
}

之前我还在ShaderGraph里实现了,但是不理解为啥这样。
突然我想到了二维旋转矩阵是这个样子滴:a是要旋转的角度:这里有参考链接:旋转矩阵
cos(a) -sin(a)
sin(a) cos(a)

而且在二维空间旋转任一点的步骤:
1.先平移到原点
2.旋转
3.在平移回去。

这样就明白了。

float x = cos(angle) * delta.x - sin(angle) * delta.y;
float y = sin(angle) * delta.x + cos(angle) * delta.y;

这两行就是旋转UV,但为啥会产生扭曲那?因为angle的不同,angle是从中心发散的射线(线性),所以越靠近边缘旋转的幅度越大。

2. Rotate结点:链接

这样来看Rotate结点就更明白了:比Twirl简单,做统一旋转

void Unity_Rotate_Radians_float(float2 UV, float2 Center, float Rotation, out float2 Out)
{UV -= Center;								//1.先平移到原点float s = sin(Rotation);float c = cos(Rotation);float2x2 rMatrix = float2x2(c, -s, s, c);	//2.构造旋转矩阵rMatrix *= 0.5;					rMatrix += 0.5;rMatrix = rMatrix * 2 - 1;					//上面三步结果不变,不知道为啥???UV.xy = mul(UV.xy, rMatrix);				//3.左乘矩阵,方向是反的,下面详细说明UV += Center;								//4.再平移到目标点Out = UV;
}

关于上面3中的问题说明一下:
Unity旋转一般是遵循左手坐标系的(视角空间是右手坐标系),我们基于左手坐标系来说明。
正常的我们旋转是右乘:矩阵 x 向量(列向量)

float2x2矩阵的构造函数如下:

public float2x2(float m00, float m01,float m10, float m11)
{this.c0 = new float2(m00, m10); //第一列this.c1 = new float2(m01, m11); //第二列}

构造时是按照参数的顺序按行排列的。

public static float2 mul(float2 a, float2x2 b)
{return float2(a.x * b.c0.x + a.y * b.c0.y,a.x * b.c1.x + a.y * b.c1.y);
}

但上面的左乘过程是:结果和左手定则的旋转方向相反
x1 = x * cos(a) + y * sin(a)
y1 = - x * sin(a) + y * cos(a)

正常使用的右乘是:结果是符合左手坐标系的左手定则的旋转方向的
x1 = x * cos(a) - y * sin(a)
y1 = x * sin(a) + y * cos(a)

其实可以直接换成:UV.xy = mul( rMatrix,UV.xy);就对了

矩阵转置后的左乘和矩阵右乘结果相同,上面的左乘没有转置,所以方向是反的。


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部