Заставь объект преследовать другой объект - PullRequest
0 голосов
/ 01 декабря 2018

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

this.el.object3D.translateOnAxis(targetposition, distance);

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

Вот мой код

    <a-scene physics="gravity: 0">
      <a-assets>
        <a-asset-item id="boat" src="../images/models/surfboard/scene.gltf"></a- 
         asset-item>
        <a-asset-item id="orca1" src="../images/models/orca/scene.gltf"></a-asset- 
         item>
      </a-assets>
      <a-entity position="0 1.8 0">
          <a-camera id="camera" look-controls="enabled: false">
                <a-entity id="boats" position="0 -2 -4" rotation="0 -90 0" 
                scale=".02 .02 .02" gltf-model="#boat" static-body></a-entity>
          </a-camera>
      </a-entity>
<a-entity id="orca" position="-1 0.7 -40" gltf-model="#orca1" static-body move></a-entity>

</a-scene>

Я пытаюсь переместить #orca в сторону #boats (которую можно перемещать с помощью WASD), используя компонент перемещения.Код для этого -

AFRAME.registerComponent('move', {
  schema: {
   speed: { type: 'number', default: 2 }
  },

  tick: function(t, dt) {
     var target = this.el.sceneEl.querySelector('#boats');
     var vec3 = new THREE.Vector3();
     var currentPosition = this.el.object3D.position;
     target.object3D.getWorldPosition(vec3);
     var  distance = dt*this.data.speed / 100;      
     this.el.object3D.translateOnAxis(vec3, distance);

     if (currentPosition.z > 30) {
        this.el.setAttribute('position', {
          z: -60
        });
      }

    }  
});

На заметку - я хотел бы, чтобы было доступно лучшее объяснение, объясняющее методы worldToLocal и LocaltoWorld.

Ответы [ 2 ]

0 голосов
/ 02 декабря 2018
var vec3 = new THREE.Vector3();
var obj = this.el.object3D;
var targ = target.object3D;
obj.position.add(vec3.copy(targ.position).sub(obj.position).multiplyScalar(0.1));
0 голосов
/ 01 декабря 2018

1) Вам необходимо получить положение лодки, переведя мировое пространство в локальное пространство.

// Get orca's object in regard to the target object
vec3 = this.el.object3D.worldToLocal(target.object3D.position.clone())

Чтобы лучше это понять, рассмотрим ту же схему, наблюдаемую с двух точек зрения.enter image description here

С точки зрения Т, ему не нужно двигаться в направлении [0, 0, 0].Необходимо рассчитать, где находится пустое поле с его собственной точки зрения, а именно [1, -0,7, 5].Кроме того, пространство касается не только положения, но и вращения (и масштаб, что здесь не важно).Когда T вращается, положение пустого ящика будет другим.

2) Проверьте расстояние, используя THREE s a.distanceTo(b).Если расстояние больше, чем вы хотите, переместите косатку:

var target = this.el.sceneEl.querySelector('a-camera'); // this should be in the init()
var vec3 = new THREE.Vector3();
var currentPosition = this.el.object3D.position;

// clone the position to operate on a copy
vec3 = this.el.object3D.worldToLocal(target.object3D.position.clone()) 
var  distance = dt*this.data.speed / 1000;      
var camFromOrca = currentPosition.distanceTo( target.object3D.position );

// if the distance is more than one meter, move the orca
if (camFromOrca > 1) {
  this.el.object3D.translateOnAxis(vec3, distance);
}

скрипка сюда .На самом деле довольно жуткий:)

...