计算机图形学(光线跟踪)--处理变换后的基本图元方法

对原文:https://blog.csdn.net/libing_zeng/article/details/60160279错误点进行了修改。 

椭球面是球面通过仿射变换T得到的。

 

现在我们的问题是:怎么ray trace变换后的椭球面?

(先重申一点:经过仿射变换之后,直线还是直线,光线还是光线)

 

我们应该这么做:

1,将光线通过仿射变换的逆变换得到“逆变换光线”;

2,用“逆变换光线”去撞击球面,得到球面上的撞击点p和法向量n;

3,通过球面上的撞击点p计算椭球面上对应撞击点p’;

4,通过球面上的法向量n计算椭球面上对应的法向量n’;

 

(接下来,只是简单地列出相关的结论。至于“推导过程”,参考《Ray Tracing from the Ground Up. 2007》和《Fundamentals ofComputer Graphics. 3rd. 2009》的相关章节)

77.1.1将光线通过仿射变换的逆变换得到“逆变换光线”
 

要对光线进行仿射变换的逆变换,则需要对光线的起点和方向向量分别进行仿射变换的逆变换。

设:原光线的起点为o,方向向量为d;“逆变换光线”的起点为o’,方向向量为d’。

分别对光线的起点和方向向量进行仿射变换的逆变换:

o’ = T-1o                      “式子1”

d’ = T-1d                      “式子2”

这里需要重点说明的是:点的仿射变换是考虑仿射变换(Translation)的,而向量的仿射变换是不考虑平移的(即齐次坐标的最后一维为0)。

 

77.1.2用“逆变换光线”去撞击球面,得到球面上的撞击点p和法向量n

最近的撞击点对应着“离‘逆变换光线’起点最短距离t”。

通过撞击点p很容求得球面上撞击点p处的法向量n。

 

77.1.3通过球面上的撞击点p计算椭球面上对应撞击点p’
 

球面上撞击点p到“逆变换光线”起点的最短距离为t;

椭球面上撞击点p’到原光线起点的最短距离为t0。

则有t0=t。

所以,可以直接将t代入原光线的方程得到椭球面上的撞击点p’。

 

77.1.4通过球面上的法向量n计算椭球面上对应的法向量n’

设:球面上撞击点p处的法向量为n,椭球面上对应撞击点p’处的法向量为n’。

则有:

n’=(T-1)Tn                    “式子3”

其中(T-1)T表示仿射变换的逆变换矩阵的转置。

推导过程,参考:《Fundamentals of Computer Graphics. 3rd. 2009》的第六章。

 

作业的一个结果:

使用的文本为

 

PerspectiveCamera {
    center 13 11 30
    direction -.16 -.12 -.5
    up 0 1 0
    angle 30
}

Lights {
    numLights 1
    DirectionalLight {
        direction -0.2 -0.4 -0.8
        color 0.8 0.8 0.8
    }
}

Background {
    color 0 0 0 
    ambientLight 0.2 0.2 0.2
}

Materials {
    numMaterials 4
    Material { diffuseColor 1 0 0 }
    Material { diffuseColor 0 1 0 }
    Material { diffuseColor 0 0 1 }
    Material { diffuseColor 1 1 1 }
}

Group {
    numObjects 2
    Group {
        numObjects 3   
        MaterialIndex 0
    Transform {
        Translate  5 0 0 
        Scale  5 0.2 0.2 
        TriangleMesh {
                obj_file cube.obj
            }
        }    
        MaterialIndex 1
    Transform {
        Translate  0 5 0 
        Scale  0.2 5 0.2 
        TriangleMesh {
                obj_file cube.obj
            }
        }    
        MaterialIndex 2
    Transform {
        Translate  0 0 5 
        Scale  0.2 0.2 5 
        TriangleMesh {
                obj_file cube.obj
            }
        }    
    }
    MaterialIndex 3
    Transform {
        Translate  4 3 1 
        XRotate  10 
    YRotate  20 
        ZRotate  30 
        Scale  2 0.5 3 
        TriangleMesh {
             obj_file cube.obj
        }
    }
}
 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值