Math 如何获取二维点,并通过透视摄影机将其投影到三维向量中

Math 如何获取二维点,并通过透视摄影机将其投影到三维向量中,math,3d,2d,projection,Math,3d,2d,Projection,我有一个2D点(x,y),我想把它投影到一个向量上,这样我就可以执行光线跟踪来检查用户是否点击了一个3D对象,我已经写了所有其他的代码,除了当我回到我的功能,从鼠标的xy线获取向量时,我没有考虑视野,我不想猜测这个因素是什么,因为“巫毒”修复对于图书馆来说不是个好主意。有数学魔术师想帮忙吗?:-) 这是我当前的代码,需要应用相机的FOV: sf::Vector3<float> Camera::Get3DVector(int Posx, int Posy, sf::Vector2<

我有一个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);
}
sf::Vector3摄像机::Get3DVector(int-Posx、int-Posy、sf::Vector2屏幕大小){
//不使用“宽镜头”,并将保持视口的纵横比
int window_x=Posx-ScreenSize.x/2;
int window_y=(ScreenSize.y-Posy)-ScreenSize.y/2;
浮动光线x=浮动(窗口x)/浮动(屏幕大小x/2);
浮动光线y=浮动(窗口y)/浮动(屏幕大小y/2);
向量3向量(射线x,射线y,--zNear);
//到全局跳线
返回乘法矩阵((向量/长度向量(向量))、_x矩阵、_y矩阵、_z矩阵);
}

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

Vector3 orig = Vector3(mouse.X,mouse.Y,0.0f);
Vector3 far = Vector3(mouse.X,mouse.Y,1.0f);
您还需要使用透视变换的倒数(如果需要世界空间,可以使用viewprojection)

然后你会:

Vector3 rayorigin = Vector3::TransformCoordinate(orig,ivp);
Vector3 rayfar = Vector3::TransformCoordinate(far,ivp);
如果需要光线,还需要方向,即:

Vector3 raydir = Normalize(rayfar-rayorigin);

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

Vector3 orig = Vector3(mouse.X,mouse.Y,0.0f);
Vector3 far = Vector3(mouse.X,mouse.Y,1.0f);
您还需要使用透视变换的倒数(如果需要世界空间,可以使用viewprojection)

然后你会:

Vector3 rayorigin = Vector3::TransformCoordinate(orig,ivp);
Vector3 rayfar = Vector3::TransformCoordinate(far,ivp);
如果需要光线,还需要方向,即:

Vector3 raydir = Normalize(rayfar-rayorigin);

我想你是在用4x4矩阵做投影吧?我不熟悉Vector3::TransformCoordination,这是一个将向量乘以4x4的函数吗?如何从相机的当前矩阵以及FOV、zNear、zFar平面和1的纵横比中获得投影矩阵?我愿意使用OpenGLYes,使用4x4矩阵进行投影。TransformCoordinate转换一个位置(所以技术上它转换为vector4,最后一个组件设置为1),然后去掉后面的w。获取投影矩阵(GL友好型,或dx版本:)。最好的方法是将您的相机(视图)保持为单独的,然后从fov/近/远创建投影,并将两个矩阵相乘(因为在其他任务中经常需要将它们分开)。我想,您使用的投影是4x4矩阵?我不熟悉Vector3::TransformCoordination,这是一个将向量乘以4x4的函数吗?如何从相机的当前矩阵以及FOV、zNear、zFar平面和1的纵横比中获得投影矩阵?我愿意使用OpenGLYes,使用4x4矩阵进行投影。TransformCoordinate转换一个位置(所以技术上它转换为vector4,最后一个组件设置为1),然后去掉后面的w。获取投影矩阵(GL友好型,或dx版本:)。最好的方法是将相机(视图)保持为单独的,然后从fov/near/far创建投影,并将两个矩阵相乘(因为在其他任务中经常需要将它们分开)。