You need to enable JavaScript to run this app. Unity中Spherical Billboarding实现星球场景2D物体防倒置技术问询
优惠活动
大模型
产品
解决方案
定价
更多

Unity中Spherical Billboarding实现星球场景2D物体防倒置技术问询

球面2D物体直立朝向修复方案

原有代码问题

  • Quaternion.Euler(direction)为错误用法:该方法接收的参数是三个轴向的旋转角度值,而非方向向量,会导致旋转计算完全不符合预期
  • 仅对齐了物体和球面的垂直关系,没有约束绕球面法线的水平旋转,因此会出现随机翻转、倒置的问题

实现逻辑

要满足「与球面相切+正向直立」的需求,本质是实现球面公告牌(Spherical Billboarding)效果,需要同时满足两个约束:

  1. 物体的向上方向始终对齐当前位置背离星球球心的法线方向,保证和球面相切
  2. 物体的面向方向始终对准玩家(或固定正北方向),避免水平方向乱转

修复后代码

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.16 04:36:05