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

如何获取3D物体表面本地空间RaycastHit点,实现变换后标记固定?

如何将RaycastHit的点转换为碰撞物体的本地空间点?

当然可以,你只需要把RaycastHit返回的世界空间碰撞点,通过碰撞物体的Transform组件转换为本地空间坐标。这样就算物体移动、旋转、缩放,本地坐标对应的表面位置也会保持固定,完全满足你放置标记/别针的需求。

实现步骤

  • 获取射线检测的世界空间点:通过RaycastHit对象的hit.point属性,拿到碰撞点的世界空间坐标。
  • 转换为本地空间点:调用碰撞物体的Transform.InverseTransformPoint()方法,传入世界空间点,得到该物体坐标系下的本地空间坐标。

代码示例(Unity C#)

void Update()
{
    if (Input.GetMouseButtonDown(0))
    {
        Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
        if (Physics.Raycast(ray, out RaycastHit hit))
        {
            // 转换世界空间点为碰撞物体的本地空间点
            Vector3 localHitPos = hit.transform.InverseTransformPoint(hit.point);
            
            // 创建并设置标记物体
            GameObject pin = GameObject.CreatePrimitive(PrimitiveType.Cylinder);
            pin.transform.SetParent(hit.transform); // 将标记绑定到碰撞物体
            pin.transform.localPosition = localHitPos; // 使用本地坐标定位
            pin.transform.localRotation = Quaternion.FromToRotation(Vector3.up, hit.normal); // 让标记贴合表面法线
            pin.transform.localScale = new Vector3(0.05f, 0.2f, 0.05f); // 调整标记大小
        }
    }
}

关键说明

  • 将标记的父物体设置为碰撞物体后,标记会继承父物体的所有变换,始终保持在表面的对应位置。
  • InverseTransformPoint方法会自动处理物体的平移、旋转和非均匀缩放,确保转换后的本地坐标精准对应原表面位置。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 04:35:01