Unity利用代码将模型的Position设置为模型碰撞器的中心点

该博客介绍了如何在Unity中通过脚本实现模型的Position与BoxCollider中心点对齐。首先获取模型的BoxCollider中心,记录旋转角度,然后重置旋转并计算缩放后的偏移值,最后更新模型的顶点坐标并将位置复位到初始记录的中心点,确保碰撞器中心为零。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转载自:
https://blog.youkuaiyun.com/weixin_42397471/article/details/113364667
在工作中有时需要将模型的Position变为模型碰撞器的中心点位置,目前实现的思路是:
先给模型添加box碰撞器,然后获得box碰撞器的中点位置(对于规则物体该位置即为模型的中点位置),然后将该位置调整为模型网格的中点位置;
但是在进行网格相关处理时需要考虑到模型的旋转与缩放可能会影响操作;

public class MeshCenterPointToZero_WSY : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        if (!GetComponent<BoxCollider>())
        {
            return;
        }
        //记录模型碰撞器中心位置
        Vector3 NewPos   = transform.TransformPoint(GetComponent<MeshFilter>().mesh.bounds.center);

        //记录旋转角度
        //因为当Y和Z轴不归零时计算会出现问题
        float X = transform.localEulerAngles.x;
        float Y = transform.localEulerAngles.y;
        float Z = transform.localEulerAngles.z;

        //先将物体的旋转重置,缩放完毕后进行旋转复位
        transform.localEulerAngles = new Vector3(X, 0, 0);

        //记录偏移值
        Vector3 PianYiv3 = new Vector3(0, 0, 0);

        PianYiv3 = transform.position -
        transform.TransformPoint(GetComponent<MeshFilter>().mesh.bounds.center);

        //如果物体有缩放时,偏移值也应该进行缩放
        PianYiv3 = new Vector3(PianYiv3.x / transform.localScale.x,
            PianYiv3.y / transform.localScale.y,
            PianYiv3.z / transform.localScale.z);

        //网格点开始偏移
        Vector3[] MeshV3 = GetComponent<MeshFilter>().mesh.vertices;

        for (int i = 0; i < MeshV3.Length; i++)
        {
            MeshV3[i] += PianYiv3;
        }

        GetComponent<MeshFilter>().mesh.vertices = MeshV3;
        GetComponent<MeshFilter>().mesh.RecalculateBounds();
        GetComponent<MeshFilter>().mesh.RecalculateNormals();
        GetComponent<MeshFilter>().mesh.RecalculateTangents();

        //旋转复位
        transform.localEulerAngles = new Vector3(transform.localEulerAngles.x, Y, Z);
        //位置复位
        transform.position = NewPos;
        //碰撞器中心点重置
        GetComponent<BoxCollider>().center = Vector3.zero;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值