Пытаюсь поместить загруженную 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^
Что ж, у вас уже есть правильный ответ.
Чтобы добавить два объекта в группу, вам нужно использовать метод .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;
Так в чем же здесь проблема? Я ничего не вижу.
Не могли бы вы показать немного больше вашего кода, пожалуйста? Например, как вы перемещаете объект и т. д. Вы перемещаете группу, куб или меч?
Добавил ссылку на проект, сейчас как раз настраиваю позицию группы для теста, планирую сделать модель игрока, чтобы игрок мог держать меч.
В коде, которым вы поделились, вы не используете группу. Вы создаете его, добавляете на сцену и все. Не хватает какого-то кода? Я даже не вижу цикла обновления, а в конце отсутствует скобка, так что, думаю, вы ее туда не поместили
это так странно, я добавлю еще скрипта
я добавил несколько фотографий
Я не знаю, почему это не работает
просто нужно было добавить это в функцию обновления, лол, большое спасибо за помощь!
я сделал это, но меч не движется вместе с кубом