You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Unity中球体UV映射纹理不随旋转问题排查求助

问题分析与解决方案

你的问题核心是纹理采样逻辑搞反了:当前代码先旋转球体上的点,再根据旋转后的点重新计算UV采样纹理,这相当于把旋转后的点当成新的球体位置来映射纹理,自然不会同步旋转,反而会因为旋转导致点的极坐标偏移,采样到极点纹理,出现180度翻转。

正确逻辑应该是:先给原始球体上的点分配固定的UV(对应纹理位置),然后只旋转点的显示位置,这样每个点的纹理采样固定,旋转时就会跟着球体同步转动。

关键代码修改

把Update方法里的UV计算和点旋转的顺序调换,用原始点计算UV,旋转后的点只用来确定显示位置:

void Update()
{
    if (Input.GetKey(KeyCode.Space))
    {
        MakeTextureBlack();

        for (int i = 0; i < numPoints; i++)
        {
            Vector3 v = GeneratePointOnSphere(i, numPoints, radius);

            // --- 先计算原始点的UV(固定对应纹理位置)---
            float theta = Mathf.Atan2(v.y, v.x);
            if (theta < 0)
                theta += 2 * Mathf.PI;
            float phi = Mathf.Acos(v.z / radius);

            float u = theta / (2 * Mathf.PI);
            float vNorm = phi / Mathf.PI;

            int x = Mathf.RoundToInt(u * (PlanetTexture.width - 1));
            int y = Mathf.RoundToInt((1 - vNorm) * (PlanetTexture.height - 1));
            x = Mathf.Clamp(x, 0, PlanetTexture.width - 1);
            y = Mathf.Clamp(y, 0, PlanetTexture.height - 1);

            Color pixelColor = PlanetTexture.GetPixel(x, y);
            // --- UV计算结束 ---

            // 再旋转点,得到显示位置
            Vector3 rotatedV = RotatePoint(v, angle1, angle2, angle3);
            Vector2 FlatPoint = new Vector2(rotatedV.x, rotatedV.y);

            float colorIntensity = GetHowFarFromCenter(FlatPoint);

            if (i < numPoints * RedPointPrc / 100)
            {
                OutputTexture.SetPixel(Mathf.RoundToInt(FlatPoint.x + 50), Mathf.RoundToInt(FlatPoint.y + 50), Color.red * colorIntensity);
            }
            else
            {
                OutputTexture.SetPixel(Mathf.RoundToInt(FlatPoint.x + 50), Mathf.RoundToInt(FlatPoint.y + 50), pixelColor);
            }
        }

        OutputTexture.Apply();
        image.texture = OutputTexture;

        angle1++;
        angle2 += 3;
        angle3 += 2;
    }
}

修改说明

  1. 原始点v是球体上的固定位置,用它计算的UV会对应纹理上的固定区域,不会随旋转改变
  2. 旋转后的rotatedV只用来确定点在2D画布上的显示位置,不影响纹理采样
  3. 这样旋转球体时,每个点带着自己固定的纹理坐标移动,视觉上就是纹理随球体同步旋转,不会再出现极点采样和翻转问题

内容的提问来源于stack exchange,提问作者KOSmek

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 22:42:14