我试图在鼠标点击时进行光线投射,最终目标是找到与平面的碰撞点。但是我无法创建射线。这个世界是使用一个平截头体和另一个我用作相机的矩阵来渲染的,顺序是平截头体 * 相机 * vertex_position。屏幕左上角为 0,0,我能够以像素为单位获得点击的 X,Y。然后我使用下面的代码将其转换为射线:
float x = (2.0f * x_screen_position) / width - 1.0f;
float y = 1.0f - (2.0f * y_screen_position) / height;
Vector4 screen_click = Vector4 (x, y, 1.0f, 1.0f);
Vector4 ray_origin_world = get_camera_matrix() * screen_click;
Vector4 tmp = (inverse(get_view_frustum()) * screen_click;
tmp = get_camera_matrix() * tmp;
Vector4 ray_direction = normalize(tmp);
view_frustum 矩阵:
Matrix4 view_frustum(float angle_of_view, float aspect_ratio, float z_near, float z_far) {
return Matrix4(
Vector4(1.0/tan(angle_of_view), 0.0, 0.0, 0.0),
Vector4(0.0, aspect_ratio/tan(angle_of_view), 0.0, 0.0),
Vector4(0.0, 0.0, (z_far+z_near)/(z_far-z_near), 1.0),
Vector4(0.0, 0.0, -2.0*z_far*z_near/(z_far-z_near), 0.0)
);
}
当“相机”矩阵为 0,0,0 时,这给出了预期的结果,但是一旦我更改到另一个位置的固定相机位置,返回的结果根本不正确。固定的“相机”矩阵:
Matrix4(
Vector4(1.0, 0.0, 0.0, 0.0),
Vector4(0.0, 0.70710678118, -0.70710678118, 0.000),
Vector4(0.0, 0.70710678118, 0.70710678118, 0.0),
Vector4(0.0, 8.0, 20.0, 1.000)
);
因为我在网上找到的许多示例都没有以这种方式实现相机,所以在这种情况下我无法找到很多信息来提供帮助。任何人都可以对此提供任何见解或为我指明更好的方向吗?