From 68acdc5183984fb2f70c91e06e94b6b8a02c816a Mon Sep 17 00:00:00 2001 From: JISAUAY Date: Mon, 17 Nov 2025 10:54:49 -0600 Subject: [PATCH] Fixed raycasting --- .attachments/fixed-raycast.png | Bin 0 -> 40994 bytes README.md | 6 +++ run.ps1 | 1 + src/World.cpp | 8 +++- src/main.cpp | 83 ++++++++++++--------------------- 5 files changed, 44 insertions(+), 54 deletions(-) create mode 100644 .attachments/fixed-raycast.png create mode 100644 run.ps1 diff --git a/.attachments/fixed-raycast.png b/.attachments/fixed-raycast.png new file mode 100644 index 0000000000000000000000000000000000000000..eacff4b129b6d2123ef8c3b5d03418fa802a74b0 GIT binary patch literal 40994 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 literal 0 HcmV?d00001 diff --git a/README.md b/README.md index 660f799..f5d939e 100644 --- a/README.md +++ b/README.md @@ -35,3 +35,9 @@ Different voxel types are now supported in the data structures and passed to the When placing a block, the program now raycasts to place where the camera is looking. ![a place of brown dirt with word Hi built out of stone.](.attachments/raycasting_test.png) + +### 0.6.1 : Raycast Bug Fixes - 11/17/25 + +It took me a couple of days to fix the ray casting. I forgot that my mesh is offset by 0.5, so 3/4 raycasts looked at least a block off of what the camera was looking at. + +![Hello, written in blocks on a dirt plane](.attachments/fixed-raycast.png) diff --git a/run.ps1 b/run.ps1 new file mode 100644 index 0000000..508130d --- /dev/null +++ b/run.ps1 @@ -0,0 +1 @@ +.\build\Debug\VoxelEngine.exe \ No newline at end of file diff --git a/src/World.cpp b/src/World.cpp index 600220d..c66ff9f 100644 --- a/src/World.cpp +++ b/src/World.cpp @@ -74,7 +74,11 @@ std::optional> World::raycast_voxel(glm::vec3 // std::cout << "[RAYCAST] Start: (" << start.x << ", " << start.y << ", " << start.z << ")" << std::endl; // std::cout << "[RAYCAST] Direction: (" << direction.x << ", " << direction.y << ", " << direction.z << ")" << std::endl; - glm::ivec3 pos = glm::ivec3(std::floor(start.x), std::floor(start.y), std::floor(start.z)); + // Adjust start position to account for voxels being centered at integer + 0.5 + // (voxel at pos (0,0,0) occupies space from (-0.5,-0.5,-0.5) to (0.5,0.5,0.5)) + glm::vec3 adjusted_start = start + glm::vec3(0.5f, 0.5f, 0.5f); + + glm::ivec3 pos = glm::ivec3(std::floor(adjusted_start.x), std::floor(adjusted_start.y), std::floor(adjusted_start.z)); // std::cout << "[RAYCAST] Starting voxel: (" << pos.x << ", " << pos.y << ", " << pos.z << ")" << std::endl; // (+1, -1, or 0 for each axis) @@ -94,7 +98,7 @@ std::optional> World::raycast_voxel(glm::vec3 // Calculate t_max: distance along ray to next voxel boundary for each axis glm::vec3 t_max; - glm::vec3 fract = start - glm::vec3(pos); + glm::vec3 fract = adjusted_start - glm::vec3(pos); // For each axis, calculate distance to the next boundary if (step_dir.x > 0) diff --git a/src/main.cpp b/src/main.cpp index 3bf9911..51846a9 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -13,6 +13,8 @@ unsigned int SCR_WIDTH = 1920; unsigned int SCR_HEIGHT = 1080; +const int EDIT_RANGE = 5; + // Jump const float JUMP_COOLDOWN = 0.0f; const float JUMP_POWER = 10.0f; // Initial Jump Speed @@ -96,12 +98,22 @@ void processInput(GLFWwindow *window) { float current_time = glfwGetTime(); + if (glfwGetKey(window, GLFW_KEY_P) == GLFW_PRESS) { + glm::vec3 eye = camera.getEyePosition(); + glm::mat4 view = camera.getView(); + glm::vec3 forward = -glm::vec3(view[0][2], view[1][2], view[2][2]); // Extract forward from view matrix + + std::cout << "Camera target (from pitch/yaw): (" << camera.target.x << ", " << camera.target.y << ", " << camera.target.z << ")" << std::endl; + std::cout << "Camera forward (from view matrix): (" << forward.x << ", " << forward.y << ", " << forward.z << ")" << std::endl; + std::cout << "Match: " << (glm::length(camera.target - forward) < 0.01f ? "YES" : "NO") << std::endl; + } + // Update targeted block every frame for highlight std::optional> raycast_result = - world.raycast_voxel(camera.getEyePosition(), camera.target, 5); + world.raycast_voxel(camera.getEyePosition(), camera.target, EDIT_RANGE); if (raycast_result.has_value()) { targeted_block = raycast_result.value().first; - + // Debug: print occasionally static int frame_count = 0; if (frame_count % 60 == 0) { @@ -203,10 +215,10 @@ void processInput(GLFWwindow *window) std::cout << "\n=== LEFT CLICK (PLACE) ===" << std::endl; std::cout << "Camera eye pos: (" << camera.getEyePosition().x << ", " << camera.getEyePosition().y << ", " << camera.getEyePosition().z << ")" << std::endl; std::cout << "Camera target: (" << camera.target.x << ", " << camera.target.y << ", " << camera.target.z << ")" << std::endl; - + std::optional> raycast_result = - world.raycast_voxel(camera.getEyePosition(), camera.target, 3); - + world.raycast_voxel(camera.getEyePosition(), camera.target, EDIT_RANGE); + if (raycast_result.has_value()) { auto [target_block, normal] = raycast_result.value(); std::cout << "Hit block at: (" << target_block.x << ", " << target_block.y << ", " << target_block.z << ")" << std::endl; @@ -228,10 +240,10 @@ void processInput(GLFWwindow *window) std::cout << "\n=== RIGHT CLICK (REMOVE) ===" << std::endl; std::cout << "Camera eye pos: (" << camera.getEyePosition().x << ", " << camera.getEyePosition().y << ", " << camera.getEyePosition().z << ")" << std::endl; std::cout << "Camera target: (" << camera.target.x << ", " << camera.target.y << ", " << camera.target.z << ")" << std::endl; - + std::optional> raycast_result = - world.raycast_voxel(camera.getEyePosition(), camera.target, 3); - + world.raycast_voxel(camera.getEyePosition(), camera.target, EDIT_RANGE); + if (raycast_result.has_value()) { auto [target_block, normal] = raycast_result.value(); std::cout << "Hit block at: (" << target_block.x << ", " << target_block.y << ", " << target_block.z << ")" << std::endl; @@ -257,7 +269,7 @@ int main() { glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); // 2. --- Create a Window --- - GLFWwindow* window = glfwCreateWindow(SCR_WIDTH, SCR_HEIGHT, "Voxel Engine 0.6.0", NULL, NULL); + GLFWwindow* window = glfwCreateWindow(SCR_WIDTH, SCR_HEIGHT, "Voxel Engine 0.6.1", NULL, NULL); if (window == NULL) { std::cerr << "Failed to create GLFW window" << std::endl; glfwTerminate(); @@ -299,10 +311,10 @@ int main() { unsigned int crosshairVAO, crosshairVBO; glGenVertexArrays(1, &crosshairVAO); glGenBuffers(1, &crosshairVBO); - + glBindVertexArray(crosshairVAO); glBindBuffer(GL_ARRAY_BUFFER, crosshairVBO); - + // Crosshair vertices in NDC (Normalized Device Coordinates: -1 to 1) float crosshairSize = 0.02f; // Size in NDC float crosshairVertices[] = { @@ -313,7 +325,7 @@ int main() { 0.0f, -crosshairSize, 0.0f, 0.0f, crosshairSize, 0.0f }; - + glBufferData(GL_ARRAY_BUFFER, sizeof(crosshairVertices), crosshairVertices, GL_STATIC_DRAW); glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0); glEnableVertexAttribArray(0); @@ -324,10 +336,10 @@ int main() { glGenVertexArrays(1, &highlightVAO); glGenBuffers(1, &highlightVBO); glGenBuffers(1, &highlightEBO); - + glBindVertexArray(highlightVAO); glBindBuffer(GL_ARRAY_BUFFER, highlightVBO); - + // Cube outline vertices (slightly larger than 1 unit cube for visibility) float offset = 0.001f; // Slight offset to prevent z-fighting float highlightVertices[] = { @@ -341,7 +353,7 @@ int main() { 0.5f + offset, 0.5f + offset, 0.5f + offset, // 6 -0.5f - offset, 0.5f + offset, 0.5f + offset // 7 }; - + // Indices for the 12 edges of the cube unsigned int highlightIndices[] = { // Bottom face @@ -351,11 +363,11 @@ int main() { // Vertical edges 0, 4, 1, 5, 2, 6, 3, 7 }; - + glBufferData(GL_ARRAY_BUFFER, sizeof(highlightVertices), highlightVertices, GL_STATIC_DRAW); glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0); glEnableVertexAttribArray(0); - + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, highlightEBO); glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(highlightIndices), highlightIndices, GL_STATIC_DRAW); glBindVertexArray(0); @@ -364,7 +376,7 @@ int main() { unsigned int debugRayVAO, debugRayVBO; glGenVertexArrays(1, &debugRayVAO); glGenBuffers(1, &debugRayVBO); - + glBindVertexArray(debugRayVAO); glBindBuffer(GL_ARRAY_BUFFER, debugRayVBO); glBufferData(GL_ARRAY_BUFFER, sizeof(float) * 6, nullptr, GL_DYNAMIC_DRAW); // 2 points * 3 coords @@ -490,39 +502,6 @@ int main() { glBindVertexArray(0); } - // ---- Draw Debug Ray ---- - { - shader.use(); - glm::vec3 ray_start = camera.getEyePosition(); - - static bool printed_debug = false; - - // Draw multiple small cubes along the ray path to make it visible - for (int i = 1; i <= 10; i++) { - float distance = i * 0.5f; - glm::vec3 point = ray_start + camera.target * distance; - - if (!printed_debug && i == 1) { - std::cout << "\n[DEBUG RAY]" << std::endl; - std::cout << "Ray start: (" << ray_start.x << ", " << ray_start.y << ", " << ray_start.z << ")" << std::endl; - std::cout << "Ray direction: (" << camera.target.x << ", " << camera.target.y << ", " << camera.target.z << ")" << std::endl; - std::cout << "First marker at: (" << point.x << ", " << point.y << ", " << point.z << ")" << std::endl; - printed_debug = true; - } - - glm::mat4 model = glm::mat4(1.0f); - model = glm::translate(model, point); - model = glm::scale(model, glm::vec3(0.1f)); // Small marker - glm::mat4 mvp = projection * view * model; - shader.setMat4("u_mvp", mvp); - shader.setVec3("u_Color", glm::vec3(1.0f, 0.0f, 0.0f)); // Red markers - - glBindVertexArray(highlightVAO); - glDrawElements(GL_LINES, 24, GL_UNSIGNED_INT, 0); - glBindVertexArray(0); - } - } - // ---- Draw Crosshair ---- glDisable(GL_DEPTH_TEST); // Draw on top of everything shader.use(); @@ -548,4 +527,4 @@ int main() { glfwTerminate(); // Clean up GLFW return 0; -} \ No newline at end of file +}