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; } }
修改说明
- 原始点
v是球体上的固定位置,用它计算的UV会对应纹理上的固定区域,不会随旋转改变 - 旋转后的
rotatedV只用来确定点在2D画布上的显示位置,不影响纹理采样 - 这样旋转球体时,每个点带着自己固定的纹理坐标移动,视觉上就是纹理随球体同步旋转,不会再出现极点采样和翻转问题
内容的提问来源于stack exchange,提问作者KOSmek
相关产品推荐
相关产品推荐

