Как поместить модель Gltf в группу

Пытаюсь поместить загруженную gltf модель в группу с кубом. Я пытался сделать это как обычно, но модель меча не двигается. Я новичок в Three.js, так как учусь в 7-м классе и делаю это в свободное время. Я отлично провел время за этой игрой, которую делаю, потому что у меня была большая неудача с моделями. Мой Chromebook работает странно из-за школьных ограничений, поэтому мне приходится запускать сценарий при повторной работе.

перед Z: После Z:

const player = new THREE.Group();
    if (sword) player.add(sword);// sword is the gltf.scene
     player.add(cube2)

вот ссылка на проект

Как бы я это сделал?

вот еще сценарий

    let robot;
    let sword;
    let swordd;

    loader.load( 'RobotExpressive.glb', function ( gltf )
        {
          robot = gltf.scene;  // sword 3D object is loaded
          robot.scale.set(1, 1, 1);
          scene.add(robot);
        } );
    loader.load( 'Sword.glb', function ( gltf )
    {
      sword = gltf.scene;  // sword 3D object is loaded
      sword.scale.set(1, 1, 1);
      scene.add(sword);
      swordd = gltf.asset;
    } );
    const robotBody = new createCannonBox(
         new CANNON.Vec3(1,1,1),
         new CANNON.Vec3(5, 5, 5),
         10
       ); 
     // Initlising the modles ^
     
     
     const cube2 = new THREE.Mesh(geometry, material);
          cube2.castShadow = true;
          scene.add(cube2);
          const cubeBody2 = new createCannonBall(1, new CANNON.Vec3(0, 2, 0), 1);
    // makeing cube using custom funtion ^
const group = new THREE.Group()
group.add( sword );
group.add( cube2 );

// Do not forget this line
scene.add( group );
// making the group^

    function go() {
            if (keys.w) moveVector.z -= 0.1;
            if (keys.s) moveVector.z += 0.1;
            if (keys.a) moveVector.x -= 0.1;
            if (keys.d) moveVector.x += 0.1;
            if (keys.c) moveVector.y -= 0.1;
            if (keys.v) moveVector.y += 0.1;
            if (checkK && colide && keys.b) (checkK = false), (colide = false);
            if (!checkK && keys.b)
              (boddy.mass = 1), Name.scale.copy(new THREE.Vector3(1, 1, 1));
            if (keys.m) controls.lock();
            if (keys.p) cubeBody.velocity.set(0, 0, 0), ballBody.velocity.set(0, 0, 0);
            window.addEventListener("keydown", function (e) {
              if (e.code == "Space" && g == true)
                cubeBody2.velocity.set(0, 5, 0), (g = false);
            });

            move(cube1);
            move(ball1);
            
            
            if (robot) robot.position.copy(robotBody.position);
            if (robot) robot.quaternion.copy(robotBody.quaternion);
           // if (sword) sword.position.copy(swordBody.position);
            //if (sword) //sword.quaternion.copy(swordBody.quaternion);

            
            
            

            moveVector.multiplyScalar(0.6);
            camera.translateX(moveVector.x);
            camera.translateZ(moveVector.z);
            camera.translateY(moveVector.y);

            if (colide && checkK) {
              Name.scale.copy(new THREE.Vector3(0.5, 0.5, 0.5));
              if (keys.c) distance += 0.1;
              if (keys.v && distance > 1) distance -= 0.1;
              boddy.quaternion.copy(camera.quaternion);
              Name.position.copy(camera.position);
              Name.translateX(moveVector.x);
              Name.translateY(moveVector.y);
              Name.translateZ(moveVector.z - distance);
              boddy.position.copy(Name.position);
            
            } else {
              pickup = true;
            }
            
           

            
            score.innerText = checkK;
            cube.position.copy(cubeBody.position);
            cube.quaternion.copy(cubeBody.quaternion);
            ball.position.copy(ballBody.position);
            ball.quaternion.copy(ballBody.quaternion);
            camera.position.y = cubeBody2.position.y;
            cubeBody2.position.x = camera.position.x;
            cubeBody2.position.z = camera.position.z;
            cubeBody2.quaternion.copy(camera.quaternion);
            if (sword && keys.z)  group.position.y = 2;
            
            if (clock.elapsedTime - lastResetTime >= resetInterval) {
              lastResetTime = clock.elapsedTime;
            }
          }

          function animate() {
            const delta = clock.getDelta();
            world.step(delta);
            check();
            go();
            fly.update(delta);
            renderer.render(scene, camera);
            requestAnimationFrame(animate);
          }

          animate();
          
       // update and animate script^
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
57
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Что ж, у вас уже есть правильный ответ.

Чтобы добавить два объекта в группу, вам нужно использовать метод .add() следующим образом:

const group = new THREE.Group()
group.add( sword );
group.add( cube2 );

// Do not forget this line
scene.add( group );

Не забудьте добавить группу на сцену.


Изменить, поскольку код является общим

Я попробовал ваш код, и он работает так, как должно быть. Я не скачивал ваши gltf-файлы, поэтому вместо меча добавил капсулу.

У вас есть группа с мечом (здесь зеленая капсула) и кубом. С вашим кодом, когда вы нажимаете Z, группа должна подняться следующим образом:

if (sword && keys.z)  group.position.y = 2;

Это перед нажатием клавиши Z:

После нажатия Z;

Так в чем же здесь проблема? Я ничего не вижу.

я сделал это, но меч не движется вместе с кубом

Blaze Branham 01.05.2024 19:40

Не могли бы вы показать немного больше вашего кода, пожалуйста? Например, как вы перемещаете объект и т. д. Вы перемещаете группу, куб или меч?

florianjea 02.05.2024 08:56

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

Blaze Branham 02.05.2024 16:34

В коде, которым вы поделились, вы не используете группу. Вы создаете его, добавляете на сцену и все. Не хватает какого-то кода? Я даже не вижу цикла обновления, а в конце отсутствует скобка, так что, думаю, вы ее туда не поместили

florianjea 03.05.2024 08:34

это так странно, я добавлю еще скрипта

Blaze Branham 03.05.2024 16:21

я добавил несколько фотографий

Blaze Branham 03.05.2024 16:46

Я не знаю, почему это не работает

Blaze Branham 03.05.2024 16:48

просто нужно было добавить это в функцию обновления, лол, большое спасибо за помощь!

Blaze Branham 03.05.2024 17:19

Другие вопросы по теме