崆、白鱼镇 2018-12-21 16:00 采纳率: 0%
浏览 264

关于Shader2.0中物体自转的问题

Pass
        {
            Cull Back
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag

            #include "UnityCG.cginc"
            float _FloatAngle;
            struct appdata
            {
                float4 vertex : POSITION;
                float2 uv : TEXCOORD0;
                float4 tangent : TANGENT;
            };

            struct v2f
            {
                float2 uv : TEXCOORD0;
                float4 vertex : SV_POSITION;
            };

            v2f vert (appdata v)
            {
                v2f o;
                float angle=_Time.z;
                float xx=v.vertex.x*cos(angle)+sin(angle)*v.vertex.z;
                float zz=-v.vertex.x*sin(angle)+cos(angle)*v.vertex.z;

                v.vertex.x=xx;
                v.vertex.z=zz;

                v.vertex.xyzw+=v.tangent*_FloatAngle;
                o.vertex = UnityObjectToClipPos(v.vertex);
                o.uv = v.uv;
                return o;
            }

            sampler2D _MainTex;

            fixed4 frag (v2f i) : SV_Target
            {
                fixed2 tmp=i.uv;
                tmp.y+=_Time.x;




                fixed4 col = tex2D(_MainTex, tmp);

                // just invert the colors
                //col.rgb = 1 - col.rgb;
                return col;
            }
            ENDCG
        }

```![图片说明](https://img-ask.csdn.net/upload/201812/21/1545379301_855625.png)
在用编写物体围绕自身y轴自转的时候,一开始只有一个Cube,其原始位置是(0,0,0),其自转是正确的;

之后将Cube移出一点位置,使其脱离坐标原点,效果也是正常;

但是!在拥有2个及两个以上Cube的时候,两个Cube的自转都是围绕着世界的原点进行旋转;  

这里有一个疑问,为什么一个可以,而多个之后就要围绕着世界轴旋转?

而且我将材质添加到Sphere的时候,无论有几个Sphere都是围绕着自身的y轴旋转

这里有另外一个疑问,为什么Sphere和Cube会出现两种不同的结果?
  • 写回答

1条回答 默认 最新

  • 你知我知皆知 2024-08-07 12:30
    关注

    以下回答参考 皆我百晓生券券喵儿 等免费微信小程序相关内容作答,并由本人整理回复。

    Shader2.0中物体自转的原因分析

    Shader2.0中物体自转时,实际上是通过一种称为“世界变换”(World Transformation)的方法来实现的。这种变换包括了对象相对于视图中心的平移、缩放以及旋转。

    问题解决方法

    如果你想要控制多个对象绕自身轴旋转,你需要确保所有这些对象都共享相同的“世界变换”。这意味着你不能只是改变其中一个对象的旋转参数,因为这会影响到其他所有对象的旋转。

    要解决这个问题,你可以:

    1. 创建一个全局旋转矩阵:首先定义一个全局旋转矩阵,这个矩阵包含了所有对象的旋转信息。例如:

      float4x4 worldRotationMatrix = float4x4.identity; // 初始化为单位矩阵
      
    2. 更新全局旋转矩阵:当有新的对象被添加或删除时,都需要更新全局旋转矩阵。这可以通过遍历所有对象,并对它们的旋转信息进行加权平均操作完成。例如:

      for (int i = 0; i < objectCount; i++)
      {
          Vector3 rotation = objects[i].rotation;
          Vector3 newRotation = worldRotationMatrix * rotation;
          objects[i].SetRotation(newRotation);
      }
      
    3. 应用全局旋转矩阵:最后一步是将全局旋转矩阵应用到所有对象上,以达到预期的效果。这通常通过使用worldMatrix * objectMatrix或者worldMatrix * transform等操作来实现。例如:

      foreach (Transform objectTransform in objects)
      {
          objectTransform.worldMatrix = worldMatrix;
      }
      

    注意:这种方法适用于单体立方体或球体等简单几何形状的情况,对于复杂的多边形场景可能无法直接做到精确控制。在处理复杂场景时,可能需要考虑使用更高级的渲染技术或工具,比如Raycast系统来模拟物理碰撞和动态运动。

    关于物体自转与材质的关系

    不同类型的材质可能会对物体的自转行为产生影响。例如,金属材质(Metal)可能会增加物体的摩擦力,导致其移动速度减慢,从而限制了物体的旋转范围。因此,在某些情况下,即使没有启用材质的自旋选项,也可能看到物体围绕自身轴旋转的现象。

    总结来说,Shader2.0中的物体自转是由全局旋转矩阵决定的,而旋转的方向取决于物体的相对位置关系。为了获得理想的结果,需要合理管理和调整各个对象的旋转信息。

    评论

报告相同问题?