Unity Pivot and Center
Unity界面上有这么一个标签:
左上角有个Pivot和Global的标签,两边都可以点选:
右边有两种模式:Global和Local,Global指的是世界坐标系的坐标,Local指的是Object的局部坐标系的坐标
左边有两种模式:Pivot 和 Center
Pivot和Center点的区别在于,Pivot Point就是物体Transform.position所在的点,在这个模式下,箭头表示的是物体的原点在世界坐标系中的坐标,而Center模式下,箭头表示的是包围物体的最小包围盒(AABB)的中心点。
举个例子,如下图所示,右下角的模型是我将左上角模型体素化后绘制出来的,两个物体的pivot坐标都是一样的,都是世界坐标系的原点,如图中箭头所指,可以看出来,左上角模型A的transform点在模型的中间,右下角网格的transform点在其左上角,两个物体虽然形状大体一样,但是由于位置不一样,所以不重合:
如果点击左上角的pivot,转换成center模式,可以看到两个模型的位置标识都变了,分别是两个Object的AABB的中心:
所以如何让两个模型重合呢
虽然二个模型位置有差距,但二者形状是一样的,所以只要二者对应的AABB也是一样的,只要让其Center点重合,那么模型肯定就重合了,取两个Model对应的Center Point的差值,然后把其Transform.position减去这个点的值,二者就可以重合了,代码如下所示:
GameObject go = new GameObject("VoxelWorld");
MeshRenderer mr = go.AddComponent<MeshRenderer>();
MeshFilter mf = go.AddComponent<MeshFilter>();
mf.sharedMesh = mesh;
// 获取原来模型的center点坐标,由于原来的模型有多个MeshRenderer,所以取整个模型的bound
Bounds bounds = new Bounds(origin.transform.position, Vector3.one);
MeshRenderer[] renderers = origin.GetComponentsInChildren<MeshRenderer>();
foreach (MeshRenderer renderer in renderers)
{
bounds.Encapsulate(renderer.bounds);
}
Vector3 offset = mr.bounds.center - bounds.center;
go.transform.position -= offset;
最后就可以使其重合了,不过感觉由于AABB的中心点还是有计算误差,二者并不是完全贴合,也有可能是我体素化场景的误差原因:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本