if (controls.isLocked === true) {
const time = performance.now();
const delta = (time - prevTime) / 1000;
velocity.x -= velocity.x * 10.0 * delta;
velocity.z -= velocity.z * 10.0 * delta;
velocity.y -= 9.6 * 100.0 * delta; // gravity
direction.z = Number(moveForward) - Number(moveBackward);
direction.x = Number(moveRight) - Number(moveLeft);
direction.normalize(); // this ensures consistent movements in all directions
if (moveForward || moveBackward) velocity.z -= direction.z * 400.0 * delta;
if (moveLeft || moveRight) velocity.x -= direction.x * 400.0 * delta;
controls.moveRight(- velocity.x * delta);
controls.moveForward(- velocity.z * delta);
controls.getObject().position.y += (velocity.y * delta); // new behavior
if (controls.getObject().position.y < 10) {
velocity.y = 0;
controls.getObject().position.y = 10;
canJump = true;
}
prevTime = time;
}
renderer.render(scene, camera);
}
function onMouseDown(event) {
if (placingBlockType && controls.isLocked === true) {
let blockGeometry, blockMaterial;
switch (placingBlockType) {
case "door":
blockGeometry = new THREE.BoxGeometry(1, 2.5, 0.2); // Simple door dimensions
blockMaterial = new THREE.MeshBasicMaterial({ color: blockColor });
break;
case "window":
blockGeometry = new THREE.BoxGeometry(1, 1, 0.1); // Reduced width for the window
blockMaterial = new THREE.MeshBasicMaterial({ color: blockColor, transparent: true, opacity: 0.5 }); // Transparent window
break;
case "roof":
blockGeometry = new THREE.ConeGeometry(1.5, 1, 4); // Pyramidal roof with 4 sides
blockMaterial = new THREE.MeshBasicMaterial({ color: blockColor });
break;
case "block":
default:
blockGeometry = new THREE.BoxGeometry(2, 1, 1); // Rectangular brick shape
blockMaterial = new THREE.MeshBasicMaterial({ color: blockColor });
break;
}
const raycaster = new THREE.Raycaster();
const mouse = new THREE.Vector2();
mouse.x = 0;
mouse.y = 0;
raycaster.setFromCamera(mouse, camera);
const intersects = raycaster.intersectObjects(objects, false);
if (intersects.length > 0) {
const intersect = intersects[0];
const voxel = new THREE.Mesh(blockGeometry, blockMaterial);
voxel.position.copy(intersect.point).add(intersect.face.normal);
voxel.position.divideScalar(2).floor().multiplyScalar(2).addScalar(1);
scene.add(voxel);
objects.push(voxel);
actionHistory.push(voxel);
const edges = new THREE.LineSegments(new THREE.EdgesGeometry(blockGeometry), new THREE.LineBasicMaterial({ color: 0x000000 }));
edges.position.copy(voxel.position);
scene.add(edges);
actionHistory.push(edges);
// Make the new object selectable
voxel.userData.selectable = true;
edges.userData.selectable = true;
}
} else {
selectObject(event);
}
}
function selectObject(event) {
const raycaster = new THREE.Raycaster();
const mouse = new THREE.Vector2();
mouse.x = (event.clientX / window.innerWidth) * 2 - 1;
mouse.y = - (event.clientY / window.innerHeight) * 2 + 1;
raycaster.setFromCamera(mouse, camera);
const intersects = raycaster.intersectObjects(objects, false);
if (intersects.length > 0) {
const intersect = intersects[0].object;
if (intersect.userData.selectable) {
selectedObject = intersect;
transformControls.attach(selectedObject);
}
} else {
selectedObject = null;
transformControls.detach();
}
}
приведенный выше код отвечает за размещение блоков в трехмерном пространстве [вот как выглядит результат, вот как он выглядит, когда я пытаюсь разместить их в другом направлении] (https:// i.sstatic.net/xFvL15oi.png) Я перепробовал все, но когда я запускаю код, между блоками, которые я пытаюсь разместить, остается зазор, и я не могу размещать блоки во всех направлениях, я могу только размещать блоки в одном направлении, нельзя размещать вверх или в любом другом направлении только в одном направлении
if (intersects.length > 0) { const intersect = intersects[0].object;
if (intersect.userData.selectable) { selectedObject = intersect; transformControls.attach(selectedObject); } } else { selectedObject = null; transformControls.detach(); } } [/code] приведенный выше код отвечает за размещение блоков в трехмерном пространстве [вот как выглядит результат, вот как он выглядит, когда я пытаюсь разместить их в другом направлении] (https:// i.sstatic.net/xFvL15oi.png) Я перепробовал все, но когда я запускаю код, между блоками, которые я пытаюсь разместить, остается зазор, и я не могу размещать блоки во всех направлениях, я могу только размещать блоки в одном направлении, нельзя размещать вверх или в любом другом направлении только в одном направлении