【发布时间】:2021-04-28 23:37:15
【问题描述】:
我有以下问题。
有一个模型,通过 setFromObject 方法我得到 Box3(截图 - http://prntscr.com/12787py)。接下来,我旋转模型并得到一个新的 Box3(截图 - http://prntscr.com/12789fy)。
是否有可能在旋转模型后得到Box3的旋转,就像Box3随着模型旋转一样?
【问题讨论】:
标签: three.js
我有以下问题。
有一个模型,通过 setFromObject 方法我得到 Box3(截图 - http://prntscr.com/12787py)。接下来,我旋转模型并得到一个新的 Box3(截图 - http://prntscr.com/12789fy)。
是否有可能在旋转模型后得到Box3的旋转,就像Box3随着模型旋转一样?
【问题讨论】:
标签: three.js
Box3 是一个盒子的数学表示。因此,它只用两个Vector3 属性(max 和min)表示,它们代表盒子的两个相对角。这些值并不代表完整 3D 空间中的框,而是轴对齐的框。
您似乎正在使用BoundingBoxHelper。这将创建一个世界对齐的线框框。这意味着它将根据几何顶点的变换位置计算其形状,因此它可能会随着您的网格旋转而改变形状。
要创建一个随对象旋转的紧密线框框,您需要直接从几何图形创建一个,并确保对两个形状应用相同的变换。
// your shape
const shapeGeo = new BoxGeometry( 10, 10, 10 )
shapeGeo.computeBoundingBox() // <----------- DO THIS BEFORE ADDING IT TO THE SCENE!
const shapeMat = new MeshPhongMaterial( { color: 'red' } )
const shapeMsh = new Mesh( shapeGeo, shapeMat )
// your wireframe
const bboxMin = shapeGeo.boundingBox.min
const bboxMax = shapeGeo.boundingBox.max
const wireGeo = new BufferGeometry()
wireGeo.setAttribute( 'position' , new BufferAttribute( new Float32Array( [
bboxMin.x, bboxMin.y, bboxMin.z,
bboxMin.x, bboxMin.y, bboxMax.z,
bboxMin.x, bboxMax.y, bboxMax.z,
bboxMin.x, bboxMax.y, bboxMin.z,
bboxMax.x, bboxMin.y, bboxMin.z,
bboxMax.x, bboxMin.y, bboxMax.z,
bboxMax.x, bboxMax.y, bboxMax.z,
bboxMax.x, bboxMax.y, bboxMin.z,
] ), 3, false ) )
wireGeo.setIndex( new BufferAttribute( new Uint8Array( [
0, 1, 1, 2, 2, 3, 3, 0,
4, 5, 5, 6, 6, 7, 7, 4,
0, 4, 1, 5, 2, 6, 3, 7
] ), 1, false ) )
const wireMat = new LineBasicMaterial( { color: 'yellow' } )
const wireBox = new LineSegments( wireGeo, wireMat )
现在,事情看起来有些奇怪。获得线盒后,您只需将其添加到您的形状中,将来对形状的更改将传递到您的线盒:
scene.add( shapeMsh )
shapeMsh.add( wireBox )
之所以有效,是因为转换会传递给子代*,而Mesh 实际上只是Object3D 的扩展,因此Mesh 可以像任何其他Object3D 派生一样有子代。
* 只要你不禁用自动矩阵更新
【讨论】:
Box3.intersectsBox 期望两个框占据相同的坐标系(具有相同的对齐方式)。