【问题标题】:How do I take a 2D point, and project it into a 3D Vector by a perspective camera如何获取 2D 点,并通过透视相机将其投影到 3D 矢量中
【发布时间】:2013-01-18 22:15:59
【问题描述】:

我有一个 2D 点 (x,y),我想将它投影到一个向量,这样我就可以执行光线追踪来检查用户是否点击了一个 3D 对象,我已经编写了所有其他代码,除了当我回到我的函数以从鼠标的 xy 线获取向量时,我没有考虑视野,我不想猜测这个因素是什么,因为“巫毒”修复对于图书馆来说不是一个好主意。有数学魔术师想帮忙吗? :-)。

这是我当前的代码,需要应用相机的 FOV:

sf::Vector3<float> Camera::Get3DVector(int Posx, int Posy, sf::Vector2<int> ScreenSize){
    //not using a "wide lens", and will maintain the aspect ratio of the viewport
    int window_x = Posx - ScreenSize.x/2;
    int window_y = (ScreenSize.y - Posy) - ScreenSize.y/2;
    float Ray_x = float(window_x)/float(ScreenSize.x/2);
    float Ray_y = float(window_y)/float(ScreenSize.y/2);

    sf::Vector3<float> Vector(Ray_x,Ray_y, -_zNear);
    // to global cords
    return MultiplyByMatrix((Vector/LengthOfVector(Vector)), _XMatrix, _YMatrix, _ZMatrix);
}

【问题讨论】:

    标签: math 3d 2d projection


    【解决方案1】:

    你不是太放屁,一件事是确保你的鼠标在 -1 到 1 的空间(不是 0 到 1) 然后创建 2 个向量:

    Vector3 orig = Vector3(mouse.X,mouse.Y,0.0f);
    Vector3 far = Vector3(mouse.X,mouse.Y,1.0f);
    

    您还需要使用透视变换的倒数(或者如果您想要世界空间,则使用视图投影)

    Matrix ivp = Matrix::Invert(Projection)
    

    然后你做:

    Vector3 rayorigin = Vector3::TransformCoordinate(orig,ivp);
    Vector3 rayfar = Vector3::TransformCoordinate(far,ivp);
    

    如果你想要一条射线,你还需要方向,这很简单:

    Vector3 raydir = Normalize(rayfar-rayorigin);
    

    【讨论】:

    • 我假设您正在使用 4x4 矩阵进行投影?而且我不熟悉 Vector3::TransformCoordinate,这是一个将向量乘以 4x4 的函数吗?如何从我的相机的当前矩阵中获取投影矩阵,以及 FOV、zNear、zFar 平面和一个纵横比?我愿意使用 OpenGL
    • 是的,使用 4x4 矩阵进行投影。 TransformCoordinate 转换一个位置(所以从技术上讲,它转换为 vector4,最后一个组件设置为 1),然后去掉 w 。获取投影矩阵(GL 友好,github.com/cinder/Cinder/blob/master/include/cinder/Matrix44.hnopper.tv/glus.html,dx 版本:msdn.microsoft.com/en-us/library/windows/desktop/…)。最好的办法是将相机(视图)分开,然后从 fov/near/far 创建投影并将两个矩阵相乘(因为您经常需要将它们分开用于其他任务)。
    猜你喜欢
    • 1970-01-01
    • 2018-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-27
    • 2010-09-09
    • 1970-01-01
    • 2018-07-15
    相关资源
    最近更新 更多