Unity Pivot and Center

Unity界面上有这么一个标签:
在这里插入图片描述

左上角有个Pivot和Global的标签,两边都可以点选:
右边有两种模式:Global和Local,Global指的是世界坐标系的坐标,Local指的是Object的局部坐标系的坐标

左边有两种模式:PivotCenter
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的中心点还是有计算误差,二者并不是完全贴合,也有可能是我体素化场景的误差原因:
在这里插入图片描述

posted @   弹吉他的小刘鸭  阅读(692)  评论(0编辑  收藏  举报
编辑推荐:
· 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搭建本
点击右上角即可分享
微信分享提示