Unity中Spherical Billboarding实现星球场景2D物体防倒置技术问询
球面2D物体直立朝向修复方案
原有代码问题
Quaternion.Euler(direction)为错误用法:该方法接收的参数是三个轴向的旋转角度值,而非方向向量,会导致旋转计算完全不符合预期- 仅对齐了物体和球面的垂直关系,没有约束绕球面法线的水平旋转,因此会出现随机翻转、倒置的问题
实现逻辑
要满足「与球面相切+正向直立」的需求,本质是实现球面公告牌(Spherical Billboarding)效果,需要同时满足两个约束:
- 物体的向上方向始终对齐当前位置背离星球球心的法线方向,保证和球面相切
- 物体的面向方向始终对准玩家(或固定正北方向),避免水平方向乱转
修复后代码
public Transform planet; // 赋值为你的星球对象 public Transform player; // 赋值为玩家对象/玩家相机对象 void Update() { Vector3 currentPos = transform.position; Vector3 planetCenter = planet.position; // 计算当前点的球面向上方向(背离球心) Vector3 surfaceUp = (currentPos - planetCenter).normalized; // 计算指向玩家的方向 Vector3 lookToPlayer = (player.position - currentPos).normalized; // 计算切平面上的右方向,保证三个轴向正交 Vector3 surfaceRight = Vector3.Cross(surfaceUp, lookToPlayer).normalized; // 校准面向方向,确保完全在切平面内,不会出现倾斜 Vector3 adjustedLookDir = Vector3.Cross(surfaceRight, surfaceUp).normalized; // 直接通过朝向和向上方向构造正确的旋转 transform.rotation = Quaternion.LookRotation(adjustedLookDir, surfaceUp); // 若2D精灵本身的朝向轴和默认Z轴不一致,可在此处添加固定偏移旋转,例如: // transform.Rotate(90, 0, 0); }
自定义调整说明
如果不需要物体面向玩家,而是固定朝向星球正北方向,只需要将lookToPlayer变量替换为星球正北方向向量在当前切平面的投影值即可。
内容的提问来源于stack exchange,提问作者Aidan Park
相关产品推荐
相关产品推荐

