Вращение элемента кузницы Autodesk относительно мировой системы координации - PullRequest
0 голосов
/ 26 марта 2020

Как получить вращение элемента относительно мировой системы координации? Я получаю информацию об элементе следующим образом:

this.viewerComponent.viewer.impl.hitTest(event.layerX, event.layerY, false);

Результат этой функции следующий:

{distance: 186476.22640731235, point: X.Vector3, face: X.Face3, faceIndex: 0, fragId: 372, …}
 distance: 186476.22640731235
 point: X.Vector3 {x: 70297.79662079967, y: 8922.73091035225, z: 9109.446866256267}
 face: X.Face3 {a: 0, b: 1, c: 2, normal: X.Vector3, vertexNormals: Array(0), …}
 faceIndex: 0
 fragId: 372
 dbId: 1959
 object: X.Mesh
 eulerOrder: (...)
 useQuaternion: (...)
 uuid: "A3D04442-BB20-4E0C-B371-3A987D212255"
 name: ""
 type: "Mesh"
 parent: undefined
 children: []
 up: X.Vector3 {x: 0, y: 1, z: 0}
 position: X.Vector3 {x: 0, y: 0, z: 0}
 rotation: X.Euler {_x: 0, _y: 0, _z: 0, _order: "XYZ", onChangeCallback: ƒ}
 quaternion: X.Quaternion {_x: 0, _y: 0, _z: 0, _w: 1, onChangeCallback: ƒ}
 scale: X.Vector3 {x: 1, y: 1, z: 1}
 rotationAutoUpdate: true
 matrix: X.Matrix4
 elements: Float32Array(16) [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1]
 __proto__: Object
 matrixWorld: X.Matrix4
 elements: Float32Array(16) [10, 0, 0, 0, 0, 10, 0, 0, 0, 0, 10, 0, 79719.9609375, -6109.12646484375, 
 1962.4998779296875, 1]
 __proto__: Object
 matrixAutoUpdate: true
 matrixWorldNeedsUpdate: false
 visible: true
 castShadow: false
 receiveShadow: false
 frustumCulled: true
 renderOrder: 0
 userData: {}
 geometry: h {id: 2265, attributes: {…}, __webglInit: undefined, byteSize: 28, vb: Float32Array(6), 
 …}
 material: X.LineBasicMaterial {uuid: "E36F7B3D-C885-475C-9AA6-A3D1024F7687", name: "", type:                     
 "LineBasicMaterial", side: 0, opacity: 1, …}
 isTemp: true
 dbId: 529
 modelId: 1
 fragId: 2264
 hide: false
 isLine: true
 isWideLine: false
 isPoint: false
 themingColor: undefined
 id: 1
 __proto__: X.Object3D

Как видно, у нас есть информационная матрица (локальная координация система, которая связана с системой координации элементов) и matrixWorld, который должен быть матрицей преобразования элемента -> глобальной системы координации. Как мне теперь получить углы из матрицы мира, чтобы узнать, каково вращение эльменента по отношению к мировой системе координации.

Надеюсь, понятно, чего я хочу, заранее спасибо.

Ответы [ 2 ]

1 голос
/ 27 марта 2020

Если я вас правильно понимаю, вы можете попробовать:

//Getting fragment info by fragId if necessary

//const matrixWorld = new THREE.Matrix4();
//const fragProxy = NOP_VIEWER.impl.getFragmentProxy(NOP_VIEWER.model, fragId)

//fragProxy.getWorldMatrix(matrixWorld);

const position = new THREE.Vector3();
const quaternion = new THREE.Quaternion();
const scale = new THREE.Vector3();

matrixWorld.decompose( position, quaternion, scale );

Подробнее о извлечении вращения здесь

0 голосов
/ 28 марта 2020

Спасибо. Это похожий подход, который я выбрал. Ваше решение, вероятно, тоже подойдет.

public onMouseMove(event) {
  var snapper = new 
  Autodesk.Viewing.Extensions.Snapping.Snapper(this.viewerComponent.viewer, {});
  const hitTestResult = this.viewerComponent.viewer.impl.snappingHitTest(event.layerX, 
  event.layerY);
  snapper.snapping3D(hitTestResult);

  // Arrow
  const geometry = new THREE.CylinderGeometry(1, 800, 2000, 100);
  const material = new THREE.MeshBasicMaterial({ color: 0xff0000 });
  const mesh = new THREE.Mesh(geometry, material);

  mesh.rotateZ(this.arcSinFunction(normal.x, normal.y, normal.z, 0, 1, 0)[0]);
  mesh.name = 'section-mesh';
  mesh.position.set(snapper.getSnapResult().intersectPoint.x, 
  snapper.getSnapResult().intersectPoint.y, snapper.getSnapResult().intersectPoint.z);
  if (!this.viewerComponent.viewer.overlays.hasScene('section-scene')) {
  this.viewerComponent.viewer.overlays.addScene('section-scene');
  }
  this.viewerComponent.viewer.overlays.addMesh([mesh, mesh_test], 'section-scene');
}

public arcSinFunction(n1: number, n2: number, n3: number, u1: number, u2: number, 
  u3: 
  number): Array<number> {
  var zähler: number = Math.abs(n1 * u1 + n2 * u2 + n3 * u3);
  // console.log(zähler);
  var nenner: number = (Math.sqrt(n1 * n1 + n2 * n2 + n3 * n3)) * (Math.sqrt(u1 * u1 + 
  u2 * u2 + u3 * u3));
  // console.log(nenner);
  var resultRadian: number = Math.asin(zähler / nenner);
  // console.log(resultRadian);
  var pi = Math.PI;
  var resultDegree = resultRadian * (180 / pi);
  // console.log(resultDegree);
  var res: Array<number> = [resultRadian, resultDegree];
  // console.log(res);
  return res;
}

С уважением

...