已知3D模型transform含缩放等信息,如何在visionOS中计算其尺寸?
在visionOS中计算3D模型尺寸的方法
在visionOS(基于RealityKit框架)中,结合模型的transform(缩放、旋转、平移)信息,你可以通过以下两种方式计算模型的实际尺寸:
1. 直接获取世界空间尺寸(推荐)
如果你的模型是RealityKit的Entity类型,直接调用worldBoundingBox属性即可得到包含所有变换及子实体的世界空间轴对齐边界框,再通过size属性提取长宽高:
import RealityKit // 假设已有目标模型Entity实例 let targetEntity: Entity = ... // 获取世界空间下的完整边界框 let worldBounds = targetEntity.worldBoundingBox // 提取实际尺寸(x/y/z分别对应长宽高) let actualSize = worldBounds.size
2. 手动计算(适用于自定义场景)
如果需要手动处理变换逻辑,可按以下步骤操作:
- 先获取模型本地空间的原始边界框(未应用任何变换)
- 将边界框的8个顶点逐一应用模型的transform矩阵
- 计算变换后顶点的轴对齐边界框,其极值差值即为实际尺寸
示例代码:
import simd // 获取本地空间边界框 let localBounds = targetEntity.boundingBox let minExtent = localBounds.lowerBound let maxExtent = localBounds.upperBound // 生成边界框的8个顶点 let localVertices = [ SIMD3(minExtent.x, minExtent.y, minExtent.z), SIMD3(minExtent.x, minExtent.y, maxExtent.z), SIMD3(minExtent.x, maxExtent.y, minExtent.z), SIMD3(minExtent.x, maxExtent.y, maxExtent.z), SIMD3(maxExtent.x, minExtent.y, minExtent.z), SIMD3(maxExtent.x, minExtent.y, maxExtent.z), SIMD3(maxExtent.x, maxExtent.y, minExtent.z), SIMD3(maxExtent.x, maxExtent.y, maxExtent.z) ] // 应用transform矩阵到每个顶点 let transformMatrix = targetEntity.transform.matrix let transformedVertices = localVertices.map { transformMatrix * $0 } // 计算变换后的边界框极值 var minTransformed = transformedVertices[0] var maxTransformed = transformedVertices[0] for vertex in transformedVertices { minTransformed = SIMD3( min(minTransformed.x, vertex.x), min(minTransformed.y, vertex.y), min(minTransformed.z, vertex.z) ) maxTransformed = SIMD3( max(maxTransformed.x, vertex.x), max(maxTransformed.y, vertex.y), max(maxTransformed.z, vertex.z) ) } // 实际尺寸 = 最大值 - 最小值 let actualSize = maxTransformed - minTransformed
注意事项
- 若模型仅涉及缩放和平移、无旋转操作,可简化计算:
localBounds.size * targetEntity.transform.scale,但存在旋转时必须使用顶点变换或worldBoundingBox方法,否则结果会失真 boundingBox属性包含所有子实体的本地空间边界框;若仅需单个模型网格的原始尺寸,需访问ModelComponent.mesh.bounds
内容的提问来源于stack exchange,提问作者Santrack
相关产品推荐
相关产品推荐

