微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用相机位置和相机角度将世界坐标转换为屏幕坐标

如何解决使用相机位置和相机角度将世界坐标转换为屏幕坐标

我正在尝试将世界坐标转换为屏幕坐标。我有可用的:fov、屏幕宽度、屏幕高度、相机位置、相机角度以及物体在世界空间中的位置。

这是我试过的:

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,cam_angle.z,1.0f));

    glm::mat4 view = glm::inverse(model);

    glm::mat4 modelview = view * model;

    return glm::project(pos,modelview,projection,glm::vec4(0,SCREEN_W,SCREEN_H));
}

但是它不起作用,输出屏幕坐标超过 30000(我没有 30k 显示器...)而且我不确定我做错了什么。

虽然存在相关性,但有时屏幕坐标恰好在我的屏幕中(我在该位置绘制了一个指示器,看看我是否做得对),如果对象移动,指示器也会移动(有点)相同速度等

非常感谢您的帮助。

解决方法

此代码:

glm::mat4 view = glm::inverse(model);

glm::mat4 modelview = view * model;

等价于glm::mat4 modelview(1.0f)(浮点不准确除外)。

计算机图形学中的modelView矩阵是指view矩阵相机模型的乘积> 要渲染的对象的矩阵。你计算的是相机的模型矩阵(如果你想在你的相机位置放置一些 3D 对象到你的世界中)。您通常不想这样做。用相机的模型矩阵渲染一个物体意味着它必须抵消自己,因为物体的中心会被转换成相机的位置,这是眼睛空间的原点.

但是,由于您的 pos 是在世界空间中给出的,因此您的对象模型矩阵隐式为单位矩阵,因此

glm::mat4 modelview = view;

正是您所需要的。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。