【问题标题】:Rotating Box3 together with the model in ThreeJS在 ThreeJS 中将 Box3 与模型一起旋转
【发布时间】:2021-04-28 23:37:15
【问题描述】:

我有以下问题。

有一个模型,通过 setFromObject 方法我得到 Box3(截图 - http://prntscr.com/12787py)。接下来,我旋转模型并得到一个新的 Box3(截图 - http://prntscr.com/12789fy)。

是否有可能在旋转模型后得到Box3的旋转,就像Box3随着模型旋转一样?

【问题讨论】:

    标签: three.js


    【解决方案1】:

    Box3 是一个盒子的数学表示。因此,它只用两个Vector3 属性(maxmin)表示,它们代表盒子的两个相对角。这些值并不代表完整 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 来检测碰撞,例如 developer.mozilla.org/en-US/docs/Games/Techniques/…
    • @Алексей 你应该在你的问题中包含这个。无论如何,Box3.intersectsBox 期望两个框占据相同的坐标系(具有相同的对齐方式)。
    • 是的,我必须包括这个员工,抱歉。你知道如何解决我的任务吗?感谢您的帮助。
    猜你喜欢
    • 2019-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多