使用相机位置和相机角度将世界转换为屏幕坐标
Convert world to screen coordinates with camera position and camera angle
我正在尝试将世界坐标转换为屏幕坐标。我有可用的:fov、屏幕宽度、屏幕高度、相机位置、相机角度以及显然物体在世界中的位置 space。
这是我试过的:
glm::vec3 world_to_screen(glm::vec3 pos,
glm::vec3 cam_angle,
glm::vec3 cam_pos) {
glm::mat4 projection = glm::perspective(
glm::radians(FOV), (float)SCREEN_W / (float)SCREEN_H, NEAR, FAR);
glm::mat4 model(1.0);
model = glm::translate(model, cam_pos);
model = glm::rotate(model, cam_angle.x, glm::vec3(1.0f, 0.0f, 0.0f));
model = glm::rotate(model, cam_angle.y, glm::vec3(0.0f, 1.0f, 0.0f));
model = glm::rotate(model, cam_angle.z, glm::vec3(0.0f, 0.0f, 1.0f));
glm::mat4 view = glm::inverse(model);
glm::mat4 modelview = view * model;
return glm::project(pos, modelview, projection,
glm::vec4(0, 0, SCREEN_W, SCREEN_H));
}
然而它不起作用,输出屏幕坐标超过 30000(我没有 30k 显示器......)我不确定我做错了什么。
虽然有相关性,但有时屏幕坐标恰好在我的屏幕上(我在该位置绘制一个指示器以查看我是否做对了)并且如果对象移动指示器也会移动(有点)同样的速度等等
非常感谢您的帮助。
此代码:
glm::mat4 view = glm::inverse(model);
glm::mat4 modelview = view * model;
等同于glm::mat4 modelview(1.0f)
(浮点数不准确除外)。
计算机图形学中的modelView矩阵指的是相机[=34]的view矩阵的乘积=] 和要渲染的对象的 模型 矩阵 。你计算的是 相机 的模型矩阵(如果你想将一些 3D 对象放置在你的相机位置的世界中)。您通常不想这样做。用相机的模型矩阵渲染一个物体意味着它必须自我抵消,因为物体的中心将被转换到相机的位置,这是 眼睛的原点 space.
然而,由于你的 pos
是在世界 space 中给出的,你的对象模型矩阵隐含地是单位矩阵,因此
glm::mat4 modelview = view;
这里是你需要的。
我正在尝试将世界坐标转换为屏幕坐标。我有可用的:fov、屏幕宽度、屏幕高度、相机位置、相机角度以及显然物体在世界中的位置 space。
这是我试过的:
glm::vec3 world_to_screen(glm::vec3 pos,
glm::vec3 cam_angle,
glm::vec3 cam_pos) {
glm::mat4 projection = glm::perspective(
glm::radians(FOV), (float)SCREEN_W / (float)SCREEN_H, NEAR, FAR);
glm::mat4 model(1.0);
model = glm::translate(model, cam_pos);
model = glm::rotate(model, cam_angle.x, glm::vec3(1.0f, 0.0f, 0.0f));
model = glm::rotate(model, cam_angle.y, glm::vec3(0.0f, 1.0f, 0.0f));
model = glm::rotate(model, cam_angle.z, glm::vec3(0.0f, 0.0f, 1.0f));
glm::mat4 view = glm::inverse(model);
glm::mat4 modelview = view * model;
return glm::project(pos, modelview, projection,
glm::vec4(0, 0, SCREEN_W, SCREEN_H));
}
然而它不起作用,输出屏幕坐标超过 30000(我没有 30k 显示器......)我不确定我做错了什么。
虽然有相关性,但有时屏幕坐标恰好在我的屏幕上(我在该位置绘制一个指示器以查看我是否做对了)并且如果对象移动指示器也会移动(有点)同样的速度等等
非常感谢您的帮助。
此代码:
glm::mat4 view = glm::inverse(model); glm::mat4 modelview = view * model;
等同于glm::mat4 modelview(1.0f)
(浮点数不准确除外)。
计算机图形学中的modelView矩阵指的是相机[=34]的view矩阵的乘积=] 和要渲染的对象的 模型 矩阵 。你计算的是 相机 的模型矩阵(如果你想将一些 3D 对象放置在你的相机位置的世界中)。您通常不想这样做。用相机的模型矩阵渲染一个物体意味着它必须自我抵消,因为物体的中心将被转换到相机的位置,这是 眼睛的原点 space.
然而,由于你的 pos
是在世界 space 中给出的,你的对象模型矩阵隐含地是单位矩阵,因此
glm::mat4 modelview = view;
这里是你需要的。