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

相机移动旋转时,如何让3D模型始终在其前方中心固定偏移位置?

解决3D模型始终保持在相机前方中心偏移位置的问题

原代码问题分析

你当前用ScreenToWorldPoint的方式存在两个核心问题:

  • 屏幕坐标的偏移是2D平面的,当相机旋转/移动时,无法对应到相机视野内的相对中心位置,导致模型偏离。
  • 传入的深度参数(Camera.main.nearClipPlane + offset)是相机空间的z值,但直接叠加偏移后,无法保证模型处于相机的视线正前方,最终出现位置偏移、显示不全的情况。

正确实现方案

要让模型始终处于相机前方中心带固定偏移、距离恒定的位置,应该基于相机的局部坐标系方向来计算位置,这样无论相机怎么移动或旋转,都能保持相对姿态。

基础实现代码

// 可在Inspector面板调节的参数
public float fixedDistance = 5f; // 相机与模型的固定距离
public Vector3 localOffset = new Vector3(0, 1, 0); // 相机局部空间的偏移(例:向上1单位)

void UpdateModelPosition()
{
    Camera mainCam = Camera.main;
    if (mainCam == null) return;

    // 1. 计算相机前方固定距离的基础位置
    Vector3 forwardBasePos = mainCam.transform.position + mainCam.transform.forward * fixedDistance;
    // 2. 叠加基于相机局部坐标系的偏移(right为右方向,up为上方向)
    Vector3 offsetPos = mainCam.transform.right * localOffset.x + mainCam.transform.up * localOffset.y;
    // 3. 设置模型最终位置
    transform.position = forwardBasePos + offsetPos;

    // 可选:让模型始终朝向相机
    transform.LookAt(mainCam.transform.position);
}

基于像素偏移的进阶实现

如果需要基于屏幕像素的精确偏移(比如中心向右偏移100像素),可以用视口坐标转换的方式:

public float fixedDistance = 5f;
public Vector2 pixelOffset = new Vector2(100, 50); // 向右100px,向上50px

void UpdateModelPosition()
{
    Camera mainCam = Camera.main;
    if (mainCam == null) return;

    // 将像素偏移转换为视口比例(视口范围0-1,(0.5,0.5)是屏幕中心)
    float viewportX = 0.5f + (pixelOffset.x / Screen.width);
    float viewportY = 0.5f + (pixelOffset.y / Screen.height);

    // 获取屏幕中心+偏移的世界位置(基于固定深度)
    Vector3 targetPos = mainCam.ViewportToWorldPoint(new Vector3(viewportX, viewportY, fixedDistance));

    transform.position = targetPos;
    // 可选:朝向相机
    transform.LookAt(mainCam.transform.position);
}

方案原理

  • mainCam.transform.forward:相机当前的视线方向,确保模型始终在相机正前方。
  • fixedDistance:固定相机与模型的直线距离,不受相机姿态影响。
  • 局部坐标系偏移(right/up):保证偏移量始终相对于相机的左右/上下方向,不会因为相机旋转而跑偏。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 09:25:28