You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

已知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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 02:56:18