Currently, I'm working on a game where players navigate in a first-person view over dynamically generated uneven terrain using Perlin noise. To make the experience more realistic, I aim to incorporate gravity into the gameplay. For this purpose, I've implemented a raycasting mechanism to calculate the distance between the player and the ground, preventing them from falling through it. Below is the code snippet (for a clearer view, please visit ):
const scene = new THREE.Scene(), camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 1, 10000000000000), renderer = new THREE.WebGLRenderer(), canvas = renderer.domElement;
camera.rotation.order = "YXZ";
renderer.setSize(window.innerWidth, window.innerHeight);
renderer.shadowMap.enabled = true;
renderer.shadowMapType = THREE.PCFSoftShadowMap;
document.body.appendChild(canvas);
// Remaining JS code goes here
onkeydown = (event) => {
if (event.key == "w") camera.translateZ(-10);
if (event.key == "a") camera.translateX(-1);
if (event.key == "s") camera.translateZ(1);
if (event.key == "d") camera.translateX(1);
if (event.key == "ArrowUp") camera.translateY(1);
if (event.key == "ArrowDown") camera.translateY(-1);
}
<meta name="viewport" content="width=device-width">
<script src="https://cdnjs.cloudflare.com/ajax/libs/three.js/94/three.min.js"></script>
<script src="https://cdn.rawgit.com/mrdoob/three.js/0949e59f/examples/js/controls/OrbitControls.js"></script>
<script src="https://cdn.rawgit.com/mrdoob/three.js/0949e59f/examples/js/utils/SceneUtils.js"></script>
<script src="https://cdn.rawgit.com/mrdoob/three.js/0949e59f/examples/js/libs/dat.gui.min.js"></script>
In certain cases, despite being above the ground, the raycasting fails to detect it at least 3 units below the camera level, leading to an issue where the player keeps falling when they shouldn't. This is quite frustrating. Are there any better alternatives to handle this scenario instead of relying solely on raycasting? Could there be a bug in the existing code causing this problem? Thanks in advance!