【发布时间】:2012-01-16 13:23:27
【问题描述】:
所以前几天我决定写一个光线追踪器,但因为我忘记了所有的矢量数学而被卡住了。 我在屏幕后面有一个点(眼睛/相机,400,300,-1000),然后是屏幕上的一个点(一个平面,从 0,0,0 到 800,600,0),我只是通过使用我正在寻找的当前像素的 x 和 y 值(使用 SFML 进行渲染,所以它类似于 267,409,0)
问题是,我不知道如何正确投射光线。我用它来测试球体相交(C++):
bool SphereCheck(Ray& ray, Sphere& sphere, float& t)
{ //operator * between 2 vec3s is a dot product
Vec3 dist = ray.start - sphere.pos; //both vec3s
float B = -1 * (ray.dir * dist);
float D = B*B - dist * dist + sphere.radius * sphere.radius; //radius is float
if(D < 0.0f)
return false;
float t0 = B - sqrtf(D);
float t1 = B + sqrtf(D);
bool ret = false;
if((t0 > 0.1f) && (t0 < t))
{
t = t0;
ret = true;
}
if((t1 > 0.1f) && (t1 < t))
{
t = t1;
ret = true;
}
return ret;
}
所以我知道光线的起点是眼睛的位置,但方向是什么?
或者,如果做不到这一点,有没有更好的方法来做到这一点?我听说有些人将光线起点设为 (x, y, -1000),将方向设为 (0,0,1),但我不知道它是如何工作的。
顺便说一句,您将如何进行转换?我假设要更改相机角度,您只需调整相机的 x 和 y(或屏幕,如果您需要大刀阔斧的改变)
【问题讨论】:
-
我认为应该是这样,但我忘记了我所知道的关于向量数学的一切,所以我不太确定。
-
基本上我想说的是,我应该如何投射光线,因为我认为我可能做错了。
-
@Chris:就像 Nocturn 说的,你将来自眼睛的光线投射到像素中。方向是通过从另一个点中减去一个点来给出的。
-
我认为我的代码在计算交叉点时可能是错误的,有人可以检查一下吗? (在原帖中)
标签: c++ vector-graphics raytracing