Поворот объекта вокруг оси z в зависимости от точки - PullRequest
0 голосов
/ 20 июня 2019

У меня есть объект наподобие HUD на передней части трубы в Three.js, однако этот Hud должен всегда выравнивать себя в зависимости от точки вектора.Эта векторная точка является верхней стороной этой точки, поэтому объект должен быть все время выровнен с этой точкой независимо от направления и положения трубки.Чтобы проиллюстрировать проблему, я прилагаю изображение.

enter image description herehttps://imgur.com/a/QNtz25E

На изображении зеленая стрелка представляет трубу, красная линия представляет векторную точку, с которой изображение круга должно вращаться вокругось z, которая должна быть выровнена.

Я пытался вычислить угол векторной точки и ее центральной точки, чтобы вычислить, сколько мне нужно повернуть по оси z, чтобы выровнять ее по точке.который работает в некоторых сценариях, когда объект не перевернут, например.Чтобы разместить объект, я использую последнюю точку трубки и использую предыдущую точку зрения, чтобы держать ее всегда перпендикулярно.

rotateobject() {
    //set the object perpendicular to the pipe
      this.hudObj.lookAt(this.previouspoint);
      let zerovector = new THREE.Euler();
      //reset the rotation
      this.hudObj.rotation.copy(zerovector);
      this.hudObj.lookAt(this.previousActualPoint);

      //Line to be able to see if the object is aligned

      var material = new THREE.LineBasicMaterial({
        color: 0x0000ff
      });
      var geometry = new THREE.Geometry();
      geometry.vertices.push(
        new THREE.Vector3( this.previouspoint.x , this.previouspoint.y, this.previouspoint.z),
        new THREE.Vector3( ((this.previouspoint.x) + this.previouspointdata.highSide.x), ((this.previouspoint.y) + this.previouspointdata.highSide.y), ((this.previouspoint.z) + this.previouspointdata.highSide.z) ),
      );   
      var line = new THREE.Line( geometry, material );
      this.scene.add( line );
        /// calculate angle and rotate in z axis
      var angleRadians = Math.atan2(parseFloat(this.previouspointdata.highSide.y.toFixed(1)), parseFloat(this.previouspointdata.highSide.x.toFixed(1)));
      if (angleRadians > 0 && angleRadians < Math.PI / 2) {
        this.hudObj.rotateZ(-(Math.PI / 2 - angleRadians) );
      }//0-90
      else if (angleRadians < Math.PI && angleRadians > Math.PI / 2) {
        this.hudObj.rotateZ((angleRadians - Math.PI / 2) );
      }//90-180
      else if (angleRadians > -Math.PI && angleRadians < -Math.PI / 2) {
        this.hudObj.rotateZ((-Math.PI/2  + angleRadians) );
      }//-180-90
      else if (angleRadians < 0 && angleRadians > -Math.PI / 2) {
        this.hudObj.rotateZ(-(Math.PI / 2 - angleRadians));
      }//-0-90
      else if (angleRadians === 0) {

      } //0
      else if (angleRadians === Math.PI || angleRadians === -Math.PI) {
        this.hudObj.rotateZ(-(Math.PI / 2) );
      }//180
      else {
        if(Math.sign(angleRadians) === -1){
         this.hudObj.rotateZ( Math.PI );
        } 
       }

    }

Я действительно ценю помощь, которую я очень застрял в этом.спасибо всем за помощь

1 Ответ

0 голосов
/ 20 июня 2019

Я думаю, что вы ищете декартовы координаты точки на сфере.Если это так, вам нужно знать:

Координаты центра сферы - Xc, Yc и Zc - радиус сферы - r - и два угла - фи и омега , тогда вы можете получить координаты этой точки - Xp, Yp и Zp - какэто:

Xp = Xc + (r * cos(omega) * sin(phi))
Yp = Yc + (r * cos(phi))
Zp = Zc + (r * sin(omega) * sin(phi)) 

см. это изображение

Затем, если вам нужен объект в этой точке, обращенной к центру, вы можете использовать функцию lookAt из THREE.js

object.lookAt( Xc, Yc, Zc );

https://threejs.org/docs/#api/en/core/Object3D.lookAt

...