在顶点着色器中对模型的顶点进行变换,然后按照老师的思路,下面模型的指针应该是按照x轴进行旋转,unity中是左手系坐标,所以其z轴朝上,y轴朝右
void Rotation(float mask, inout float3 vertex, float offset, float angle) {
vertex.y -= offset * mask; //对带有遮罩的时针进行平移
float radx = radians(angle * mask);
float sinx, cosx = 0;
sincos(radx, sinx, cosx);
vertex.yz = float2(vertex.y * cosx - vertex.z * sinx, vertex.y * sinx + vertex.z * cosx);
vertex.y += offset * mask;
}
void ClockRotation(float3 color , inout float3 vertex ) {
Rotation( color.r, vertex, _MoveOffect, _HourAngle);
Rotation( color.g, vertex, _MoveOffect, _MinuteAngle);
Rotation( color.b, vertex, _MoveOffect, _SecondAngle);
}
// 输入结构>>>顶点Shader>>>输出结构
VertexOutput vert(VertexInput v) {
VertexOutput o = (VertexOutput)0;
//对时间针进行顶点变换操作
ClockRotation(v.color.rgb, v.vertex.xyz);
}
后面发现效果图为:
可以很明显的看到是围绕着z轴在转动,而不是x轴
后面发现是因为在Transform里面调了y轴的转轴,而该顶点坐标是在模型空间下的坐标,而在一开始默认情况下模型空间与时间空间的坐标一致,从而是围绕着x轴进行转动。但后面对于该模型在世界空间下的坐标进行了沿y轴90度角旋转,从而让模型空间下的坐标也沿y轴进行90度转动,从而导致了后面所观看的效果是指针围绕着z轴进行旋转。
对于这种情况就最好是先不对该模型进行空间下的变换,先在已有情况下对顶点处理完后再对其世界空间进行转换。
void Rotation( float mask, inout float3 vertex, float offset, float angle ) {
vertex.y -= offset * mask; //对带有遮罩的时针进行平移
float radz = radians(angle * mask);
float sinz, cosz = 0;
sincos(radz, sinz, cosz);
//目前该顶点还是在物体空间的顶点数据,没有转换到世界空间下的顶点数据,所以所用的坐标系还是物体坐标系,而组件的坐标系则是世界空间下的坐标系,刚开始的时候默认情况下物体空间下的坐标系和世界空间下的坐标系是一样,但再转变了就不一样了
//这里要留意,需要将模型的旋转参数全部初始化规为0,然后再利用目前的进行代码编写来调节参数,最后再改变该模型的整体旋转
vertex.xy = float2(vertex.x * cosz - vertex.y * sinz, vertex.x * sinz + vertex.y * cosz); //其旋转参数调节的顺序为:代码利用原默认坐标系进行旋转,然后再是根据组件来旋转模型,因为组件旋转的时候会顺带把物体自身的空间坐标轴也进行相应的旋转
vertex.y += offset * mask;
}