作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
这是我在光线追踪方面的第三个问题,但已经取得了进展 :P 所以,我正在为我的面向对象编程类实现一个 C++ 光线追踪器,到目前为止,我已经实现了单色球体和平面,并支持反射和镜面反射阴影。这是我做过的一个例子:
现在我正在尝试实现一般多面体。我正在使用 this algorithm 的修改版本计算与 nFaces() 面的任意多面体的交点,每个面都包含在由 Vec Polyhedron::point(int face) 和 定义的平面中Vec Polyhedron::normal(int face):
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;
}
所以我通过移除球并添加一个红色立方体(我实现的唯一类型的多面体是长方体)来修改球的场景并运行它。这是结果:
我完全不知道为什么。有什么线索吗?
最佳答案
我当时很愚蠢,误解了算法。我认为 (tl < te) 部分会处理多面体表面的所有内容,但事实并非如此。傻我。
关于c++ - 奇怪的阴影立方体光线追踪,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21736727/
我正在尝试使用 Sfml 编写 2D 游戏。对于那个游戏,我需要一个 Lightengine 和一些代码,这些代码可以为我提供玩家可见的世界区域。由于这两个问题非常吻合(实际上是相同的),我想同时解决
我是一名优秀的程序员,十分优秀!