对于鼠标点击光线投射一条线,为什么在我移动相机后我的起始光线没有更新到我的相机位置?
For mouse click ray casting a line, why aren't my starting rays updating to my camera position after I move my camera?
当相机移动时,为什么我的起始光线仍然停留在原点 0, 0, 0,即使相机位置已经更新?
如果我启动程序并且我的相机位置默认为 0、0、0,它工作正常。但是一旦我移动我的相机,例如向右平移并单击更多,线条仍然来自 0 0 0 当它应该从相机所在的地方开始时。我做错了什么吗?我已经检查以确保它们在主循环中得到更新。我使用了下面引用的代码片段:
picking in 3D with ray-tracing using NinevehGL or OpenGL i-phone
// 1. Get mouse coordinates then normalize
float x = (2.0f * lastX) / width - 1.0f;
float y = 1.0f - (2.0f * lastY) / height;
// 2. Move from clip space to world space
glm::mat4 inverseWorldMatrix = glm::inverse(proj * view);
glm::vec4 near_vec = glm::vec4(x, y, -1.0f, 1.0f);
glm::vec4 far_vec = glm::vec4(x, y, 1.0f, 1.0f);
glm::vec4 startRay = inverseWorldMatrix * near_vec;
glm::vec4 endRay = inverseWorldMatrix * far_vec;
// perspective divide
startR /= startR.w;
endR /= endR.w;
glm::vec3 direction = glm::vec3(endR - startR);
// start the ray points from the camera position
glm::vec3 startPos = glm::vec3(camera.GetPosition());
glm::vec3 endPos = glm::vec3(startPos + direction * someLength);
第一个屏幕截图我点击了一些光线,第二个我将我的相机向右移动并点击更多但初始起始光线仍然在 0, 0, 0。我正在寻找的是光线出现在第 3 幅图像中相机位置的任何地方,即红色光线抱歉造成混淆,红线应该射出并射向远处而不是向上。
// and these are my matrices
// projection
glm::mat4 proj = glm::perspective(glm::radians(camera.GetFov()), (float)width / height, 0.1f, 100.0f);
// view
glm::mat4 view = camera.GetViewMatrix(); // This returns glm::lookAt(this->Position, this->Position + this->Front, this->Up);
// model
glm::mat4 model = glm::translate(glm::mat4(1.0f), glm::vec3(0.0f, 0.0f, 0.0f));
很难说问题出在代码的什么地方。但是,我使用这个函数进行光线投射,它改编自 scratch-a-pixel 和 learnopengl 的代码:
vec3 rayCast(double xpos, double ypos, mat4 projection, mat4 view) {
// converts a position from the 2d xpos, ypos to a normalized 3d direction
float x = (2.0f * xpos) / WIDTH - 1.0f;
float y = 1.0f - (2.0f * ypos) / HEIGHT;
float z = 1.0f;
vec3 ray_nds = vec3(x, y, z);
vec4 ray_clip = vec4(ray_nds.x, ray_nds.y, -1.0f, 1.0f);
// eye space to clip we would multiply by projection so
// clip space to eye space is the inverse projection
vec4 ray_eye = inverse(projection) * ray_clip;
// convert point to forwards
ray_eye = vec4(ray_eye.x, ray_eye.y, -1.0f, 0.0f);
// world space to eye space is usually multiply by view so
// eye space to world space is inverse view
vec4 inv_ray_wor = (inverse(view) * ray_eye);
vec3 ray_wor = vec3(inv_ray_wor.x, inv_ray_wor.y, inv_ray_wor.z);
ray_wor = normalize(ray_wor);
return ray_wor;
}
您可以在其中使用 startPos = camera.Position
和 endPos = camera.Position + rayCast(...) * scalar_amount
画线。
当相机移动时,为什么我的起始光线仍然停留在原点 0, 0, 0,即使相机位置已经更新?
如果我启动程序并且我的相机位置默认为 0、0、0,它工作正常。但是一旦我移动我的相机,例如向右平移并单击更多,线条仍然来自 0 0 0 当它应该从相机所在的地方开始时。我做错了什么吗?我已经检查以确保它们在主循环中得到更新。我使用了下面引用的代码片段:
picking in 3D with ray-tracing using NinevehGL or OpenGL i-phone
// 1. Get mouse coordinates then normalize
float x = (2.0f * lastX) / width - 1.0f;
float y = 1.0f - (2.0f * lastY) / height;
// 2. Move from clip space to world space
glm::mat4 inverseWorldMatrix = glm::inverse(proj * view);
glm::vec4 near_vec = glm::vec4(x, y, -1.0f, 1.0f);
glm::vec4 far_vec = glm::vec4(x, y, 1.0f, 1.0f);
glm::vec4 startRay = inverseWorldMatrix * near_vec;
glm::vec4 endRay = inverseWorldMatrix * far_vec;
// perspective divide
startR /= startR.w;
endR /= endR.w;
glm::vec3 direction = glm::vec3(endR - startR);
// start the ray points from the camera position
glm::vec3 startPos = glm::vec3(camera.GetPosition());
glm::vec3 endPos = glm::vec3(startPos + direction * someLength);
第一个屏幕截图我点击了一些光线,第二个我将我的相机向右移动并点击更多但初始起始光线仍然在 0, 0, 0。我正在寻找的是光线出现在第 3 幅图像中相机位置的任何地方,即红色光线抱歉造成混淆,红线应该射出并射向远处而不是向上。
// and these are my matrices
// projection
glm::mat4 proj = glm::perspective(glm::radians(camera.GetFov()), (float)width / height, 0.1f, 100.0f);
// view
glm::mat4 view = camera.GetViewMatrix(); // This returns glm::lookAt(this->Position, this->Position + this->Front, this->Up);
// model
glm::mat4 model = glm::translate(glm::mat4(1.0f), glm::vec3(0.0f, 0.0f, 0.0f));
很难说问题出在代码的什么地方。但是,我使用这个函数进行光线投射,它改编自 scratch-a-pixel 和 learnopengl 的代码:
vec3 rayCast(double xpos, double ypos, mat4 projection, mat4 view) {
// converts a position from the 2d xpos, ypos to a normalized 3d direction
float x = (2.0f * xpos) / WIDTH - 1.0f;
float y = 1.0f - (2.0f * ypos) / HEIGHT;
float z = 1.0f;
vec3 ray_nds = vec3(x, y, z);
vec4 ray_clip = vec4(ray_nds.x, ray_nds.y, -1.0f, 1.0f);
// eye space to clip we would multiply by projection so
// clip space to eye space is the inverse projection
vec4 ray_eye = inverse(projection) * ray_clip;
// convert point to forwards
ray_eye = vec4(ray_eye.x, ray_eye.y, -1.0f, 0.0f);
// world space to eye space is usually multiply by view so
// eye space to world space is inverse view
vec4 inv_ray_wor = (inverse(view) * ray_eye);
vec3 ray_wor = vec3(inv_ray_wor.x, inv_ray_wor.y, inv_ray_wor.z);
ray_wor = normalize(ray_wor);
return ray_wor;
}
您可以在其中使用 startPos = camera.Position
和 endPos = camera.Position + rayCast(...) * scalar_amount
画线。