Fix bugs for pbrt bilinear patch
This commit is contained in:
parent
bb2089477e
commit
0480e041cd
6 changed files with 85 additions and 33 deletions
|
|
@ -224,6 +224,23 @@ impl AffineTransform {
|
|||
+ self.mat[2][3],
|
||||
)
|
||||
}
|
||||
|
||||
pub fn inverse_transform_pos(&self, pos: Pos3) -> Pos3 {
|
||||
Pos3::new(
|
||||
self.inv[0][0] * pos.x()
|
||||
+ self.inv[0][1] * pos.y()
|
||||
+ self.inv[0][2] * pos.z()
|
||||
+ self.inv[0][3],
|
||||
self.inv[1][0] * pos.x()
|
||||
+ self.inv[1][1] * pos.y()
|
||||
+ self.inv[1][2] * pos.z()
|
||||
+ self.inv[1][3],
|
||||
self.inv[2][0] * pos.x()
|
||||
+ self.inv[2][1] * pos.y()
|
||||
+ self.inv[2][2] * pos.z()
|
||||
+ self.inv[2][3],
|
||||
)
|
||||
}
|
||||
pub fn transform_dir(&self, dir: Dir3) -> Dir3 {
|
||||
Dir3::new(
|
||||
self.mat[0][0] * dir.x() + self.mat[0][1] * dir.y() + self.mat[0][2] * dir.z(),
|
||||
|
|
@ -231,13 +248,27 @@ impl AffineTransform {
|
|||
self.mat[2][0] * dir.x() + self.mat[2][1] * dir.y() + self.mat[2][2] * dir.z(),
|
||||
)
|
||||
}
|
||||
pub fn transform_normal(&self, pos: Pos3) -> Pos3 {
|
||||
Pos3::new(
|
||||
pub fn inverse_transform_dir(&self, dir: Dir3) -> Dir3 {
|
||||
Dir3::new(
|
||||
self.inv[0][0] * dir.x() + self.inv[0][1] * dir.y() + self.inv[0][2] * dir.z(),
|
||||
self.inv[1][0] * dir.x() + self.inv[1][1] * dir.y() + self.inv[1][2] * dir.z(),
|
||||
self.inv[2][0] * dir.x() + self.inv[2][1] * dir.y() + self.inv[2][2] * dir.z(),
|
||||
)
|
||||
}
|
||||
pub fn transform_normal(&self, pos: Dir3) -> Dir3 {
|
||||
Dir3::new(
|
||||
self.inv[0][0] * pos.x() + self.inv[0][1] * pos.y() + self.inv[0][2] * pos.z(),
|
||||
self.inv[1][0] * pos.x() + self.inv[1][1] * pos.y() + self.inv[1][2] * pos.z(),
|
||||
self.inv[2][0] * pos.x() + self.inv[2][1] * pos.y() + self.inv[2][2] * pos.z(),
|
||||
)
|
||||
}
|
||||
pub fn inverse_transform_normal(&self, pos: Dir3) -> Dir3 {
|
||||
Dir3::new(
|
||||
self.mat[0][0] * pos.x() + self.mat[0][1] * pos.y() + self.mat[0][2] * pos.z(),
|
||||
self.mat[1][0] * pos.x() + self.mat[1][1] * pos.y() + self.mat[1][2] * pos.z(),
|
||||
self.mat[2][0] * pos.x() + self.mat[2][1] * pos.y() + self.mat[2][2] * pos.z(),
|
||||
)
|
||||
}
|
||||
|
||||
pub fn transform_ray(&self, ray: Ray) -> Ray {
|
||||
Ray::new(
|
||||
|
|
@ -302,7 +333,7 @@ impl Mul<AffineTransform> for AffineTransform {
|
|||
self.mat[2][0] * rhs.mat[0][2]
|
||||
+ self.mat[2][1] * rhs.mat[1][2]
|
||||
+ self.mat[2][2] * rhs.mat[2][2]
|
||||
+ self.mat[2][3] * rhs.mat[3][3],
|
||||
+ self.mat[2][3] * rhs.mat[3][2],
|
||||
self.mat[2][0] * rhs.mat[0][3]
|
||||
+ self.mat[2][1] * rhs.mat[1][3]
|
||||
+ self.mat[2][2] * rhs.mat[2][3]
|
||||
|
|
@ -376,7 +407,7 @@ impl Mul<AffineTransform> for AffineTransform {
|
|||
rhs.inv[2][0] * self.inv[0][2]
|
||||
+ rhs.inv[2][1] * self.inv[1][2]
|
||||
+ rhs.inv[2][2] * self.inv[2][2]
|
||||
+ rhs.inv[2][3] * self.inv[3][3],
|
||||
+ rhs.inv[2][3] * self.inv[3][2],
|
||||
rhs.inv[2][0] * self.inv[0][3]
|
||||
+ rhs.inv[2][1] * self.inv[1][3]
|
||||
+ rhs.inv[2][2] * self.inv[2][3]
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue