ROTATION WORKS!!!!
This commit is contained in:
parent
053a69e5b7
commit
ab590a4844
7 changed files with 15 additions and 541 deletions
BIN
result_image.png
BIN
result_image.png
Binary file not shown.
|
Before Width: | Height: | Size: 6.3 KiB After Width: | Height: | Size: 7.8 KiB |
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
scenes/cube_on_plane.glb
Normal file
BIN
scenes/cube_on_plane.glb
Normal file
Binary file not shown.
|
|
@ -1,526 +0,0 @@
|
||||||
{
|
|
||||||
"asset":{
|
|
||||||
"generator":"Khronos glTF Blender I/O v4.1.34",
|
|
||||||
"version":"2.0"
|
|
||||||
},
|
|
||||||
"extensionsUsed":[
|
|
||||||
"KHR_lights_punctual"
|
|
||||||
],
|
|
||||||
"extensionsRequired":[
|
|
||||||
"KHR_lights_punctual"
|
|
||||||
],
|
|
||||||
"extensions":{
|
|
||||||
"KHR_lights_punctual":{
|
|
||||||
"lights":[
|
|
||||||
{
|
|
||||||
"color":[
|
|
||||||
1,
|
|
||||||
1,
|
|
||||||
1
|
|
||||||
],
|
|
||||||
"intensity":54351.41306588226,
|
|
||||||
"type":"point",
|
|
||||||
"name":"Light"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"scene":0,
|
|
||||||
"scenes":[
|
|
||||||
{
|
|
||||||
"name":"Scene",
|
|
||||||
"nodes":[
|
|
||||||
0,
|
|
||||||
1,
|
|
||||||
2,
|
|
||||||
3,
|
|
||||||
4,
|
|
||||||
5,
|
|
||||||
6
|
|
||||||
]
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"nodes":[
|
|
||||||
{
|
|
||||||
"mesh":0,
|
|
||||||
"name":"Cube"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"extensions":{
|
|
||||||
"KHR_lights_punctual":{
|
|
||||||
"light":0
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"name":"Light",
|
|
||||||
"rotation":[
|
|
||||||
-0.28416627645492554,
|
|
||||||
0.7269423007965088,
|
|
||||||
0.34203392267227173,
|
|
||||||
0.5232754945755005
|
|
||||||
],
|
|
||||||
"translation":[
|
|
||||||
4.076245307922363,
|
|
||||||
5.903861999511719,
|
|
||||||
-1.0054539442062378
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"camera":0,
|
|
||||||
"name":"Camera",
|
|
||||||
"rotation":[
|
|
||||||
0,
|
|
||||||
1,
|
|
||||||
0,
|
|
||||||
0
|
|
||||||
],
|
|
||||||
"translation":[
|
|
||||||
2,
|
|
||||||
10,
|
|
||||||
-1.9999992847442627
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"mesh":1,
|
|
||||||
"name":"Cube.001"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"mesh":2,
|
|
||||||
"name":"Cube.002",
|
|
||||||
"translation":[
|
|
||||||
2,
|
|
||||||
10,
|
|
||||||
-10
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"mesh":3,
|
|
||||||
"name":"Cube.003",
|
|
||||||
"rotation":[
|
|
||||||
0,
|
|
||||||
0.3826834559440613,
|
|
||||||
0,
|
|
||||||
0.9238795638084412
|
|
||||||
],
|
|
||||||
"translation":[
|
|
||||||
2,
|
|
||||||
10,
|
|
||||||
10
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"mesh":4,
|
|
||||||
"name":"Cube.004",
|
|
||||||
"translation":[
|
|
||||||
-10,
|
|
||||||
10,
|
|
||||||
0
|
|
||||||
]
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"cameras":[
|
|
||||||
{
|
|
||||||
"name":"Camera",
|
|
||||||
"perspective":{
|
|
||||||
"aspectRatio":1,
|
|
||||||
"yfov":0.7853981852531433,
|
|
||||||
"zfar":100,
|
|
||||||
"znear":0.0010000000474974513
|
|
||||||
},
|
|
||||||
"type":"perspective"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"materials":[
|
|
||||||
{
|
|
||||||
"doubleSided":true,
|
|
||||||
"name":"Material",
|
|
||||||
"pbrMetallicRoughness":{
|
|
||||||
"baseColorFactor":[
|
|
||||||
0.800000011920929,
|
|
||||||
0.800000011920929,
|
|
||||||
0.800000011920929,
|
|
||||||
1
|
|
||||||
],
|
|
||||||
"metallicFactor":0,
|
|
||||||
"roughnessFactor":0.5
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"doubleSided":true,
|
|
||||||
"name":"Material.001",
|
|
||||||
"pbrMetallicRoughness":{
|
|
||||||
"baseColorFactor":[
|
|
||||||
0.8002041578292847,
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
1
|
|
||||||
],
|
|
||||||
"metallicFactor":0,
|
|
||||||
"roughnessFactor":0.5
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"doubleSided":true,
|
|
||||||
"name":"Material.003",
|
|
||||||
"pbrMetallicRoughness":{
|
|
||||||
"baseColorFactor":[
|
|
||||||
0.019036345183849335,
|
|
||||||
0,
|
|
||||||
0.8002663850784302,
|
|
||||||
1
|
|
||||||
],
|
|
||||||
"metallicFactor":0,
|
|
||||||
"roughnessFactor":0.5
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"doubleSided":true,
|
|
||||||
"name":"Material.004",
|
|
||||||
"pbrMetallicRoughness":{
|
|
||||||
"baseColorFactor":[
|
|
||||||
0.0012476131087169051,
|
|
||||||
0.8003553152084351,
|
|
||||||
0,
|
|
||||||
1
|
|
||||||
],
|
|
||||||
"metallicFactor":0,
|
|
||||||
"roughnessFactor":0.5
|
|
||||||
}
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"meshes":[
|
|
||||||
{
|
|
||||||
"name":"Cube",
|
|
||||||
"primitives":[
|
|
||||||
{
|
|
||||||
"attributes":{
|
|
||||||
"POSITION":0,
|
|
||||||
"NORMAL":1,
|
|
||||||
"TEXCOORD_0":2
|
|
||||||
},
|
|
||||||
"indices":3,
|
|
||||||
"material":0
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name":"Cube.001",
|
|
||||||
"primitives":[
|
|
||||||
{
|
|
||||||
"attributes":{
|
|
||||||
"POSITION":4,
|
|
||||||
"NORMAL":5,
|
|
||||||
"TEXCOORD_0":6
|
|
||||||
},
|
|
||||||
"indices":3,
|
|
||||||
"material":0
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name":"Cube.002",
|
|
||||||
"primitives":[
|
|
||||||
{
|
|
||||||
"attributes":{
|
|
||||||
"POSITION":7,
|
|
||||||
"NORMAL":8,
|
|
||||||
"TEXCOORD_0":9
|
|
||||||
},
|
|
||||||
"indices":10,
|
|
||||||
"material":1
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name":"Cube.003",
|
|
||||||
"primitives":[
|
|
||||||
{
|
|
||||||
"attributes":{
|
|
||||||
"POSITION":11,
|
|
||||||
"NORMAL":12,
|
|
||||||
"TEXCOORD_0":13
|
|
||||||
},
|
|
||||||
"indices":10,
|
|
||||||
"material":2
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name":"Cube.004",
|
|
||||||
"primitives":[
|
|
||||||
{
|
|
||||||
"attributes":{
|
|
||||||
"POSITION":14,
|
|
||||||
"NORMAL":15,
|
|
||||||
"TEXCOORD_0":16
|
|
||||||
},
|
|
||||||
"indices":10,
|
|
||||||
"material":3
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"accessors":[
|
|
||||||
{
|
|
||||||
"bufferView":0,
|
|
||||||
"componentType":5126,
|
|
||||||
"count":14,
|
|
||||||
"max":[
|
|
||||||
1.4142135381698608,
|
|
||||||
2,
|
|
||||||
1.4142135381698608
|
|
||||||
],
|
|
||||||
"min":[
|
|
||||||
-1.4142135381698608,
|
|
||||||
0,
|
|
||||||
-1.4142135381698608
|
|
||||||
],
|
|
||||||
"type":"VEC3"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"bufferView":1,
|
|
||||||
"componentType":5126,
|
|
||||||
"count":14,
|
|
||||||
"type":"VEC3"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"bufferView":2,
|
|
||||||
"componentType":5126,
|
|
||||||
"count":14,
|
|
||||||
"type":"VEC2"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"bufferView":3,
|
|
||||||
"componentType":5123,
|
|
||||||
"count":36,
|
|
||||||
"type":"SCALAR"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"bufferView":4,
|
|
||||||
"componentType":5126,
|
|
||||||
"count":14,
|
|
||||||
"max":[
|
|
||||||
-0.5857864618301392,
|
|
||||||
2,
|
|
||||||
-0.5857864618301392
|
|
||||||
],
|
|
||||||
"min":[
|
|
||||||
-3.4142136573791504,
|
|
||||||
0,
|
|
||||||
-3.4142136573791504
|
|
||||||
],
|
|
||||||
"type":"VEC3"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"bufferView":5,
|
|
||||||
"componentType":5126,
|
|
||||||
"count":14,
|
|
||||||
"type":"VEC3"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"bufferView":6,
|
|
||||||
"componentType":5126,
|
|
||||||
"count":14,
|
|
||||||
"type":"VEC2"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"bufferView":7,
|
|
||||||
"componentType":5126,
|
|
||||||
"count":14,
|
|
||||||
"max":[
|
|
||||||
1,
|
|
||||||
1,
|
|
||||||
1
|
|
||||||
],
|
|
||||||
"min":[
|
|
||||||
-1,
|
|
||||||
-1,
|
|
||||||
-1
|
|
||||||
],
|
|
||||||
"type":"VEC3"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"bufferView":8,
|
|
||||||
"componentType":5126,
|
|
||||||
"count":14,
|
|
||||||
"type":"VEC3"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"bufferView":9,
|
|
||||||
"componentType":5126,
|
|
||||||
"count":14,
|
|
||||||
"type":"VEC2"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"bufferView":10,
|
|
||||||
"componentType":5123,
|
|
||||||
"count":36,
|
|
||||||
"type":"SCALAR"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"bufferView":11,
|
|
||||||
"componentType":5126,
|
|
||||||
"count":14,
|
|
||||||
"max":[
|
|
||||||
1,
|
|
||||||
1,
|
|
||||||
1
|
|
||||||
],
|
|
||||||
"min":[
|
|
||||||
-1,
|
|
||||||
-1,
|
|
||||||
-1
|
|
||||||
],
|
|
||||||
"type":"VEC3"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"bufferView":12,
|
|
||||||
"componentType":5126,
|
|
||||||
"count":14,
|
|
||||||
"type":"VEC3"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"bufferView":13,
|
|
||||||
"componentType":5126,
|
|
||||||
"count":14,
|
|
||||||
"type":"VEC2"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"bufferView":14,
|
|
||||||
"componentType":5126,
|
|
||||||
"count":14,
|
|
||||||
"max":[
|
|
||||||
1,
|
|
||||||
1,
|
|
||||||
1
|
|
||||||
],
|
|
||||||
"min":[
|
|
||||||
-1,
|
|
||||||
-1,
|
|
||||||
-1
|
|
||||||
],
|
|
||||||
"type":"VEC3"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"bufferView":15,
|
|
||||||
"componentType":5126,
|
|
||||||
"count":14,
|
|
||||||
"type":"VEC3"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"bufferView":16,
|
|
||||||
"componentType":5126,
|
|
||||||
"count":14,
|
|
||||||
"type":"VEC2"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"bufferViews":[
|
|
||||||
{
|
|
||||||
"buffer":0,
|
|
||||||
"byteLength":168,
|
|
||||||
"byteOffset":0,
|
|
||||||
"target":34962
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"buffer":0,
|
|
||||||
"byteLength":168,
|
|
||||||
"byteOffset":168,
|
|
||||||
"target":34962
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"buffer":0,
|
|
||||||
"byteLength":112,
|
|
||||||
"byteOffset":336,
|
|
||||||
"target":34962
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"buffer":0,
|
|
||||||
"byteLength":72,
|
|
||||||
"byteOffset":448,
|
|
||||||
"target":34963
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"buffer":0,
|
|
||||||
"byteLength":168,
|
|
||||||
"byteOffset":520,
|
|
||||||
"target":34962
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"buffer":0,
|
|
||||||
"byteLength":168,
|
|
||||||
"byteOffset":688,
|
|
||||||
"target":34962
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"buffer":0,
|
|
||||||
"byteLength":112,
|
|
||||||
"byteOffset":856,
|
|
||||||
"target":34962
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"buffer":0,
|
|
||||||
"byteLength":168,
|
|
||||||
"byteOffset":968,
|
|
||||||
"target":34962
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"buffer":0,
|
|
||||||
"byteLength":168,
|
|
||||||
"byteOffset":1136,
|
|
||||||
"target":34962
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"buffer":0,
|
|
||||||
"byteLength":112,
|
|
||||||
"byteOffset":1304,
|
|
||||||
"target":34962
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"buffer":0,
|
|
||||||
"byteLength":72,
|
|
||||||
"byteOffset":1416,
|
|
||||||
"target":34963
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"buffer":0,
|
|
||||||
"byteLength":168,
|
|
||||||
"byteOffset":1488,
|
|
||||||
"target":34962
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"buffer":0,
|
|
||||||
"byteLength":168,
|
|
||||||
"byteOffset":1656,
|
|
||||||
"target":34962
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"buffer":0,
|
|
||||||
"byteLength":112,
|
|
||||||
"byteOffset":1824,
|
|
||||||
"target":34962
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"buffer":0,
|
|
||||||
"byteLength":168,
|
|
||||||
"byteOffset":1936,
|
|
||||||
"target":34962
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"buffer":0,
|
|
||||||
"byteLength":168,
|
|
||||||
"byteOffset":2104,
|
|
||||||
"target":34962
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"buffer":0,
|
|
||||||
"byteLength":112,
|
|
||||||
"byteOffset":2272,
|
|
||||||
"target":34962
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"buffers":[
|
|
||||||
{
|
|
||||||
"byteLength":2384,
|
|
||||||
"uri":"cube_on_plane.bin"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
30
src/ray.rs
30
src/ray.rs
|
|
@ -1,5 +1,5 @@
|
||||||
use std::ops::Mul;
|
use std::ops::Mul;
|
||||||
use cgmath::{Angle, InnerSpace, Matrix4, SquareMatrix, Vector3, Vector4};
|
use cgmath::{Angle, InnerSpace, Matrix3, Matrix4, Point3, SquareMatrix, Vector3, Vector4};
|
||||||
use easy_gltf::{Camera, Projection};
|
use easy_gltf::{Camera, Projection};
|
||||||
|
|
||||||
pub struct Ray {
|
pub struct Ray {
|
||||||
|
|
@ -15,24 +15,25 @@ pub fn construct_primary_rays(camera: &Camera,
|
||||||
//TODO: ignoring aspect ratio here
|
//TODO: ignoring aspect ratio here
|
||||||
let (fovy, aspect_ratio) = match camera.projection {
|
let (fovy, aspect_ratio) = match camera.projection {
|
||||||
Projection::Perspective { yfov, aspect_ratio } => {
|
Projection::Perspective { yfov, aspect_ratio } => {
|
||||||
(yfov, aspect_ratio) }
|
(yfov, aspect_ratio)
|
||||||
|
}
|
||||||
Projection::Orthographic { .. } => { panic!("Orthographic rendering not supported.") }
|
Projection::Orthographic { .. } => { panic!("Orthographic rendering not supported.") }
|
||||||
};
|
};
|
||||||
|
|
||||||
//ray origin in world space
|
//ray origin in world space
|
||||||
let origin_world_space = camera.position();
|
let origin_world_space = camera.position();
|
||||||
//dbg!(camera.transform);
|
|
||||||
|
//use a custom transform matrix because the one from easy_gltf is fucked
|
||||||
|
let transform_matrix = Matrix4::from_cols(
|
||||||
|
camera.right().extend(0.0),
|
||||||
|
-camera.up().extend(0.0),
|
||||||
|
-camera.forward().extend(0.0),
|
||||||
|
origin_world_space.extend(1.0),
|
||||||
|
);
|
||||||
|
|
||||||
// the distance from the camera origin to the view plane
|
// the distance from the camera origin to the view plane
|
||||||
let z: f32 = height as f32 / (2.0 * fovy.mul(0.5).tan());
|
let z: f32 = height as f32 / (2.0 * fovy.mul(0.5).tan());
|
||||||
|
|
||||||
//obtain the inverse transformation Matrix
|
|
||||||
let inverse_transform = camera.transform.invert().unwrap_or_else(||
|
|
||||||
panic!("Non invertible transform Matrix. giving up.")
|
|
||||||
);
|
|
||||||
|
|
||||||
dbg!(camera.transform);
|
|
||||||
|
|
||||||
//TODO: take ray multiplier per pixel into account here
|
//TODO: take ray multiplier per pixel into account here
|
||||||
let mut rays: Vec<Ray> = Vec::with_capacity(height * width);
|
let mut rays: Vec<Ray> = Vec::with_capacity(height * width);
|
||||||
|
|
||||||
|
|
@ -41,7 +42,7 @@ pub fn construct_primary_rays(camera: &Camera,
|
||||||
rays.push(generate_single_primary_ray(
|
rays.push(generate_single_primary_ray(
|
||||||
width,
|
width,
|
||||||
height,
|
height,
|
||||||
&inverse_transform,
|
&transform_matrix,
|
||||||
z,
|
z,
|
||||||
pixel_x_coord,
|
pixel_x_coord,
|
||||||
pixel_y_coord,
|
pixel_y_coord,
|
||||||
|
|
@ -52,7 +53,7 @@ pub fn construct_primary_rays(camera: &Camera,
|
||||||
|
|
||||||
fn generate_single_primary_ray(image_width: usize,
|
fn generate_single_primary_ray(image_width: usize,
|
||||||
image_height: usize,
|
image_height: usize,
|
||||||
inverse_transform: &Matrix4<f32>,
|
cam_to_world_transform: &Matrix4<f32>,
|
||||||
focal_length: f32,
|
focal_length: f32,
|
||||||
u: usize,
|
u: usize,
|
||||||
v: usize,
|
v: usize,
|
||||||
|
|
@ -63,9 +64,8 @@ fn generate_single_primary_ray(image_width: usize,
|
||||||
v as f32 - (image_height as f32 / 2.0),
|
v as f32 - (image_height as f32 / 2.0),
|
||||||
focal_length,
|
focal_length,
|
||||||
0.0);
|
0.0);
|
||||||
//TODO: Rotation is fucked
|
|
||||||
//x rotation has sign wrong, y and z are flipped
|
let direction_world_space = cam_to_world_transform * direction_view_space.normalize();
|
||||||
let direction_world_space = inverse_transform * direction_view_space.normalize();
|
|
||||||
|
|
||||||
Ray { source: ray_origin, direction: direction_world_space.truncate().normalize() }
|
Ray { source: ray_origin, direction: direction_world_space.truncate().normalize() }
|
||||||
}
|
}
|
||||||
Loading…
Add table
Add a link
Reference in a new issue