Mugen87 / yuka

JavaScript library for developing Game AI.
https://mugen87.github.io/yuka/
MIT License
1.13k stars 91 forks source link

SteerBehavior - Vehicle facing the wrong direction #71

Closed mikeyriver2 closed 2 years ago

mikeyriver2 commented 2 years ago

Hi! I'm quite new to threejs and 3d stuff in general and I've been experimenting the SteeringBehavior.

I recently purchased a model from sketchfab and basically my goal is to have the model follow the cursor around in a 2d plane. The model seems to be following the target (point of the cursor) just fine, but the model is facing the wrong way.

Loading the gltf file:

let dog;
    const gltfLoader = new GLTFLoader();

    gltfLoader.load('./premium_wolf/source/model.gltf', (gltcScene) => {
      dog = gltcScene;
      dog.scene.matrixAutoUpdate = false; 
      vehicle.setRenderComponent(dog.scene, sync);
      scene.add(dog.scene);
    });

Applying seek behavior to vehicle/my model:

    const seekBehavior = new YUKA.ArriveBehavior(target.position, 2, 1); 
    vehicle.steering.add(seekBehavior);

Output: Peek 2022-09-22 03-09

Expected Behavior:

Is there a way to rotate the model while the steering behavior is active?

Mugen87 commented 2 years ago

Is there a way to rotate the model while the steering behavior is active?

Yes, you have to make sure that the default forward direction of the model is (0,0,1). That means when you load the model and add it to the scene, it should look along the positive z-axis.

Ideally, you fix this in Blender and just import the updated model. If you don't want to do that, transform the model's geometry via rotateX(), rotateY() or rotateZ()(depending on your use case). More information about the geometry API at the three.js docs.

mikeyriver2 commented 2 years ago

Hi @Mugen87 thanks for the reply! I managed to get around this by rotating the model by 180 degrees using the threejs editor :>

If you don't want to do that, transform the model's geometry via rotateX(), rotateY() or rotateZ()(depending on your use case). More information about the geometry API at the three.js docs.

Right, this was what I tried before editing the gltf itself. But if I'm not mistaken, since I had to call dog.scene.matrixAutoUpdate = false; to allow YUKA to do the calculations instead, using rotation.x or rotateX() did not apply. Is there a way for YUKA to handle rotations manually? I also tried rotateTo but since the steering behavior is applied to the model, it didn't rotate - https://mugen87.github.io/yuka/docs/Vehicle.html

Mugen87 commented 2 years ago

using rotation.x or rotateX() did not apply.

You are using the Object3D interface. When using the methods from BufferGeometry, the calculations of Yuka do not interfere.

Check out how a cone geometry is transformed in order to achieve a proper alignment:

https://github.com/Mugen87/yuka/blob/e6250dc7f5899fa9a752d817cfa4b0d37e7fd983/examples/math/orientation/index.html#L39-L40