javascript - ThreeJS 将 GLTF 模型与边界框的大小匹配
问题描述
我想将导入的 GLB 模型缩放到与场景中相同大小的立方体。需要确保模型保持在阴影投射区域内并且足够大以使阴影可见。
我已经计算了两个对象的边界框:
// shadowcasting area
var sceneExtent = new THREE.BoxGeometry( 4, 4, 4 );
var cube = new THREE.Mesh( sceneExtent, material );
var sceneBounds = sceneExtent.computeBoundingBox()
和
// imported mesh
model.traverse( function ( child ) {
if ( child.isMesh ) {
child.geometry.computeBoundingBox()
meshBounds = child.geometry.boundingBox
}
} );
但现在我不知道如何处理它们来修改scale
GLTF 模型
// meshBounds = child.geometry.boundingBox
// sceneBounds = sceneExtent.computeBoundingBox()
// how to resize model scale to match size of sceneBounds
model.scale.set(1,1,1)
我已经进行了相当多的研究,但我似乎不了解我迄今为止找到的解决方案。
如何修改模型比例以匹配sceneBounds
我所拥有的信息?
更新:要获得边界框,请.setFromObject()
改用:
sceneBounds = new THREE.Box3().setFromObject( cube );
meshBounds = new THREE.Box3().setFromObject( model );
解决方案
例如像这样:
// Calculate side lengths of scene (cube) bounding box
let lengthSceneBounds = {
x: Math.abs(sceneBounds.max.x - sceneBounds.min.x),
y: Math.abs(sceneBounds.max.y - sceneBounds.min.y),
z: Math.abs(sceneBounds.max.z - sceneBounds.min.z),
};
// Calculate side lengths of glb-model bounding box
let lengthMeshBounds = {
x: Math.abs(meshBounds.max.x - meshBounds.min.x),
y: Math.abs(meshBounds.max.y - meshBounds.min.y),
z: Math.abs(meshBounds.max.z - meshBounds.min.z),
};
// Calculate length ratios
let lengthRatios = [
(lengthSceneBounds.x / lengthMeshBounds.x),
(lengthSceneBounds.y / lengthMeshBounds.y),
(lengthSceneBounds.z / lengthMeshBounds.z),
];
// Select smallest ratio in order to contain the model within the scene
let minRatio = Math.min(...lengthRatios);
// If you need some padding on the sides
let padding = 0;
minRatio -= padding;
// Use smallest ratio to scale the model
model.scale.set(minRatio, minRatio, minRatio);
推荐阅读
- node.js - 使用 Nodejs 将数据插入到 MongoDb
- c# - Azure Function App: TimerTrigger not Firing when Deployed
- typescript - 无法使用 CDK 为现有用户附加策略
- python - 从多个字典写入单个 JSON
- java - 元类构造函数覆盖不适用于 @CompileStatic 注释类中的方法
- android - Exoplayer2 流式传输 HLS 视频,有时仅播放有声视频(未播放视频)
- opencv - 如果我在具有恒定分辨率的相机中设置较小的分辨率会怎样?
- javascript - 如何在 Owl Carousel (2) 中为 Angular 2/7 实现 onChange 事件/回调/自定义点
- android - 颤振错误无法确定任务':app:compileDebugJavaWithJavac'的依赖关系
- express - Fastify 和 Express 可以一起运行吗?