three.js 使用 getWorldPosition 获取世界坐标

记录一下项目中的需求,组合后旋转,解组后需要模型位置为旋转后位置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
disCombinationModel (ModelArry, type) {
  // 判断是否有选中
  if (ModelArry.length === 1) {
    const ob = ModelArry[0]
    // 判断是否是组合
    if (ob.typeName === 'combination') {
      const { position, rotation } = ob
      // 历史记录,用于上一步、下一步
      let nudoHistory = {
        operation: [],
        type: 'DisCombinationModel' // 解组动作
      }
      // 循环组合内的children
      while (ob.children.length > 0) {
        const children = ob.children[0]
        // 调用updateMatrixWorld()保证图形矩阵正确
        scene.scene.updateMatrixWorld(true)
        // 模型的.getWorldPosition()方法获得该模型在世界坐标下的三维坐标
        var worldPosition = new THREE.Vector3()
        children.getWorldPosition(worldPosition)
        // 设置children的坐标
        children.position.set(worldPosition.x, worldPosition.y, worldPosition.z)
        // 设置children旋转角为 组合旋转角
        children.rotateY(rotation.y)
        nudoHistory.operation.push(children)
        InitializeModel.geometryGropu.add(children)
        ob.remove(children)
      }
      if (type) {
        this.addHistory(nudoHistory)
      } else {
        this.addRedoHistory(nudoHistory)
      }
      InitializeModel.geometryGropu.remove(ob)
      this.removeAllHelperLine() // 移除组合的选中状态辅助线
      this.clearCheckEdModelArry() // 清除选中数组
    } else {
      this.$Msg('error', '只有组合才能进行解组!')
    }
  }
},

  实现效果

旋转前

 

旋转后

解组后

 

posted @   fanjiajia  阅读(884)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示