模型空间下的旋转和世界空间下的旋转

本文探讨了在Unity中的顶点着色器中,如何正确处理模型旋转以实现预期的x轴旋转。关键在于理解模型空间与世界空间的区别,并强调了先顶点处理后整体旋转的重要性。作者揭示了在初始默认状态下,模型空间与世界空间一致,但后续的空间转换可能导致旋转方向变化。
摘要由CSDN通过智能技术生成

在顶点着色器中对模型的顶点进行变换,然后按照老师的思路,下面模型的指针应该是按照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;
                }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值