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

Unity中实现模型统一间距放置:3D球面目标点计算问题

3D场景下Unity模型固定间距放置方案

嘿,这个问题我之前做3D放置类系统的时候也踩过坑!其实不用纠结复杂的3D角度计算,用Unity的向量运算就能轻松搞定核心需求——不管原鼠标位置在中心点的“球内”还是“球外”,都能沿着原方向生成距离中心点刚好10单位的模型。

核心思路拆解

咱们的目标是:从指定中心点出发,沿着鼠标指向的方向(原位置相对中心点的方向),生成一个距离中心点固定10单位的模型。核心逻辑就是把方向向量归一化,再缩放成固定长度,最后叠加到中心点坐标上,完全不用手动算余弦正弦。

具体实现步骤(附代码)

下面是可直接复用的Unity脚本示例,我会逐行解释关键逻辑:

using UnityEngine;

public class FixedDistancePlacer : MonoBehaviour
{
    [Header("配置参数")]
    public Transform centerReferencePoint; // 放置的中心点(比如场景中的某个锚点)
    public float requiredDistance = 10f;   // 模型与中心点的固定间距
    public GameObject modelToSpawn;       // 要放置的模型预制体

    void Update()
    {
        // 假设左键点击时触发放置
        if (Input.GetMouseButtonDown(0))
        {
            // 1. 把鼠标屏幕坐标转成3D射线,获取场景中的原点击位置
            Ray mouseRay = Camera.main.ScreenPointToRay(Input.mousePosition);
            if (Physics.Raycast(mouseRay, out RaycastHit hitResult))
            {
                Vector3 originalClickPos = hitResult.point;

                // 2. 计算原位置相对于中心点的方向向量
                Vector3 directionFromCenter = originalClickPos - centerReferencePoint.position;

                // 3. 归一化方向向量(确保长度为1,这样乘以10就是刚好10单位的距离)
                // 加个小判断避免原位置和中心点重合时的除以0问题
                if (directionFromCenter.magnitude > 0.001f)
                {
                    directionFromCenter.Normalize();
                }
                else
                {
                    // 如果刚好点在中心点上,给个默认方向(比如向上,可按需修改)
                    directionFromCenter = Vector3.up;
                }

                // 4. 计算最终的模型放置位置
                Vector3 finalSpawnPos = centerReferencePoint.position + directionFromCenter * requiredDistance;

                // 5. 生成模型(这里用Quaternion.identity保持默认旋转,也可以按需调整)
                Instantiate(modelToSpawn, finalSpawnPos, Quaternion.identity);
            }
        }
    }
}

关键细节说明

  • 为什么不用三角函数?:Unity的Vector3.Normalize()已经帮我们处理了3D空间中的方向计算,不管是X/Y/Z轴的组合方向,都能直接得到单位向量,比手动计算方位角、俯仰角再转换坐标高效得多,还不容易出错。
  • 适配不同放置场景:如果你的放置不是基于地面射线(比如UI拖拽到3D空间),只需要把originalClickPos换成拖拽对应的3D坐标即可,核心逻辑完全不变。
  • 边界情况处理:代码里加了方向向量长度的判断,避免原位置和中心点完全重合时的异常,你可以根据自己的场景修改默认方向(比如改成Camera的前方向)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:16:53