如何获取3D模型X/Y/Z轴长度以实现物体等间距排列?此前用Scale尝试失败
获取3D模型实际尺寸实现等间距排列
一、获取3D模型的X/Y/Z轴实际长度
Scale是缩放比例,和模型真实物理尺寸不直接对应,必须通过**包围盒(Bounds)**来获取实际尺寸,不同引擎的实现方式如下:
Unity(C#)
- 通过Renderer组件获取(已考虑物体缩放):
Renderer objRenderer = targetObj.GetComponent<Renderer>(); Vector3 actualSize = objRenderer.bounds.size; float xLen = actualSize.x; float yLen = actualSize.y; float zLen = actualSize.z;
- 直接从Mesh获取(需手动乘以物体缩放):
MeshFilter meshFilter = targetObj.GetComponent<MeshFilter>(); Vector3 meshRawSize = meshFilter.mesh.bounds.size; Vector3 actualSize = meshRawSize * targetObj.transform.localScale;
Unreal Engine(C++)
通过Actor的包围盒接口获取:
FVector origin; FVector actualSize; GetActorBounds(true, origin, actualSize); // true表示考虑子物体 float XLen = actualSize.X; float YLen = actualSize.Y; float ZLen = actualSize.Z;
Blender(Python)
直接读取物体的dimensions属性(已考虑缩放):
import bpy target_obj = bpy.context.active_object x_len = target_obj.dimensions.x y_len = target_obj.dimensions.y z_len = target_obj.dimensions.z
二、其他等间距排列的方法
1. 基于包围盒中心的自动排列
不用单独计算尺寸,直接利用包围盒的中心和半长来控制间距,确保物体间的间隙固定:
以Unity X轴排列为例:
List<GameObject> objects = new List<GameObject>(); // 待排列的物体列表 float gap = 1.5f; // 物体间的间隙 float currentPosX = 0; foreach (var obj in objects) { Renderer renderer = obj.GetComponent<Renderer>(); float halfX = renderer.bounds.extents.x; // 设置物体位置(以X轴为例,Y/Z轴同理) obj.transform.position = new Vector3(currentPosX + halfX, 0, 0); // 更新下一个物体的起始位置:当前物体总长度 + 间隙 currentPosX += renderer.bounds.size.x + gap; }
2. 利用锚点/枢轴对齐
如果物体的枢轴点已经在中心位置,可以直接通过枢轴点的间距来排列,但注意:枢轴点可能和模型实际中心不符,不如包围盒可靠。若要使用,需先将所有物体的枢轴统一到几何中心。
3. 批量布局工具(引擎内置)
很多3D引擎内置了布局工具,比如Unity的Layout Group组件(3D物体也可适配使用),或Blender的Array修改器,通过可视化参数即可实现等间距排列,无需手动写代码。
内容的提问来源于stack exchange,提问作者RpDev
相关产品推荐
相关产品推荐

