如何获取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
相关产品推荐
相关产品推荐

