1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
|
// Camera parameters and helpers for SDF raymarching effects
struct CameraParams {
inv_view: mat4x4<f32>,
fov: f32,
near_plane: f32,
far_plane: f32,
aspect_ratio: f32,
}
struct Ray {
origin: vec3<f32>,
direction: vec3<f32>,
}
// Generate camera ray for given UV coordinates (-1 to 1)
fn getCameraRay(cam: CameraParams, uv: vec2<f32>) -> Ray {
let cam_pos = vec3<f32>(cam.inv_view[3].x, cam.inv_view[3].y, cam.inv_view[3].z);
// Compute ray direction from FOV and aspect ratio
let tan_fov = tan(cam.fov * 0.5);
let ndc = vec3<f32>(uv.x * cam.aspect_ratio * tan_fov, uv.y * tan_fov, -1.0);
// Transform direction by inverse view matrix (rotation only)
let dir = normalize(
cam.inv_view[0].xyz * ndc.x +
cam.inv_view[1].xyz * ndc.y +
cam.inv_view[2].xyz * ndc.z
);
return Ray(cam_pos, dir);
}
// Extract camera position from inverse view matrix
fn getCameraPosition(cam: CameraParams) -> vec3<f32> {
return vec3<f32>(cam.inv_view[3].x, cam.inv_view[3].y, cam.inv_view[3].z);
}
// Extract camera forward vector (view direction)
fn getCameraForward(cam: CameraParams) -> vec3<f32> {
return -normalize(vec3<f32>(cam.inv_view[2].x, cam.inv_view[2].y, cam.inv_view[2].z));
}
// Extract camera up vector
fn getCameraUp(cam: CameraParams) -> vec3<f32> {
return normalize(vec3<f32>(cam.inv_view[1].x, cam.inv_view[1].y, cam.inv_view[1].z));
}
// Extract camera right vector
fn getCameraRight(cam: CameraParams) -> vec3<f32> {
return normalize(vec3<f32>(cam.inv_view[0].x, cam.inv_view[0].y, cam.inv_view[0].z));
}
|