1

我有一个 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);
}
4

1 回答 1

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);
于 2013-01-19T18:29:54.487 回答