奇异阴影立方体光线跟踪 这是我在光线跟踪中的第三个问题,但是已经有了进步:P,所以我为我的面向对象编程类实现了一个C++光线跟踪程序,到目前为止,我已经实现了支持反射和镜面阴影的单色球面和平面。这是我做过的一件事的一个例子:
现在我尝试实现一般的多面体。我正在使用的一个修改版本来计算与任意多面体nFaces()面的交点,每个面都包含在一个由Vec polyhedron::point(int face)和Vec polyhedron::normal(int face)定义的平面中:奇异阴影立方体光线跟踪 这是我在光线跟踪中的第三个问题,但是已经有了进步:P,所以我为我的面向对象编程类实现了一个C++光线跟踪程序,到目前为止,我已经实现了支持反射和镜面阴影的单色球面和平面。这是我做过的一件事的一个例子:,c++,raytracing,C++,Raytracing,现在我尝试实现一般的多面体。我正在使用的一个修改版本来计算与任意多面体nFaces()面的交点,每个面都包含在一个由Vec polyhedron::point(int face)和Vec polyhedron::normal(int face)定义的平面中: Vec多面体::相交(Vec o,Vec d) { int face=nFaces(); Vec-ni(0,0,0),pi(0,0,0); 单位te=-1; 单位tl=-1; 单位t=0; 单位N,D; Vec v=d.正常(); int
Vec多面体::相交(Vec o,Vec d)
{
int face=nFaces();
Vec-ni(0,0,0),pi(0,0,0);
单位te=-1;
单位tl=-1;
单位t=0;
单位N,D;
Vec v=d.正常();
int facein,faceout;
对于(int i=0;i0)
{
if(N<0)
{
如果(t>te){
te=t;
facein=i;
}
}否则{
如果((tl==-1)| |(t
因此,我通过移除球并添加一个红色立方体(我实现的唯一多面体类型是长方体)来修改带有球的场景并运行它。结果是:
我完全不知道为什么。有什么线索吗?我太笨了,误解了算法。我原以为(tl
Vec Polyhedron::intersect(Vec o, Vec d)
{
int face = nFaces();
Vec ni(0,0,0), pi(0,0,0);
unit te = -1;
unit tl = -1;
unit t = 0;
unit N, D;
Vec v = d.normal();
int facein, faceout;
for(int i = 0; i < face; i++)
{
ni = normal(i);
pi = point(i);
N = ((pi - o)*ni);
D = v*ni;
if(D == 0 && N < 0)
return o;
if(D != 0)
{
t = N/D;
if(t > 0)
{
if(N < 0)
{
if(t > te){
te = t;
facein = i;
}
}else{
if((tl == -1) || (t < tl)){
tl = t;
faceout = i;
}
}
if((tl != -1) && (tl < te))
return o;
}
}
}
if(tl != -1)
{
if(te != -1)
{
v = v*te + o;
return (v + normal(facein)*0.000000000001);
}
v = v*tl + o;
return (v + normal(faceout)*0.000000000001);
}
return o;
}