gpt4 book ai didi

c - 如何使用 lookAt 矩阵计算光线追踪中的光线?

转载 作者:太空宇宙 更新时间:2023-11-03 23:58:10 28 4
gpt4 key购买 nike

据我所知,“lookat”方法是在场景中放置/旋转相机的最简单方法之一。所以我在我的光线追踪代码中实现了 ( https://www.scratchapixel.com/lessons/mathematics-physics-for-computer-graphics/lookat-function ) 上可用的矩阵,但我不知道如何使用它来计算光线。

基本上,我所做的是将相机置于负 Z 轴,向正 Z 轴发送光线,然后选择迭代 View 平面的 X 和 Y 轴的像素。这很容易,因为 View 平面在相机前面,我必须简单地将迭代的 X 和 Y 分配给光线目标 X 和 Y。但是我希望能够在空间的任何部分发送光线。

你能帮我理解怎么做吗?

谢谢!

我主要做的事情:

{        
double deg = 50.;
double rad = deg / (180.0 / M_PI);
double distance = (WIDTH / 2) * (cotan(rad / 2));
ray.orig.x = HEIGH / 2.0;
ray.orig.y = WIDTH / 2.0;
ray.orig.z = -distance;
y = -1;
while (++y <= HEIGH)
{
x = -1;
while (++x <= WIDTH)
{
ray.dest.x = x - ray.orig.x;
ray.dest.y = y - ray.orig.y;
ray.dest.z = 0. - ray.orig.z;
ray.dest = ve_normalize(&ray.dest);
check_objects(c, &ray, 0);
add_diffuse_light(c);
put_pixel(c, &x, &y);
}
}
}

处理观察矩阵的函数:

t_lookat    lookati(t_vector *from, t_vector *to)
{
t_lookat lookat;
t_vector fo;
t_vector ri;
t_vector up;

t_vector tmp;
tmp.x = 0; tmp.y = 1; tmp.z = 0;
fo = ve_subtraction(from, to);
fo = ve_normalize(&fo);
ri = ve_cross(&tmp, &fo);
ri = ve_normalize(&ri);
up = ve_cross(&fo, &ri);
up = ve_normalize(&up);

lookat.ri.x = ri.x;
lookat.ri.y = ri.y;
lookat.ri.z = ri.z;
lookat.up.x = up.x;
lookat.up.y = up.y;
lookat.up.z = up.z;
lookat.fo.x = fo.x;
lookat.fo.y = fo.y;
lookat.fo.z = fo.z;
lookat.fr.x = from->x;
lookat.fr.y = from->y;
lookat.fr.z = from->z;

return(lookat);
}

t_vector orientate(t_vector *a, t_vector *from, t_vector *to)
{
t_lookat k;

k = lookati(from, to);
t_vector orientate;

orientate.x = a->x * k.ri.x + a->y * k.up.x + a->z * k.fo.x + a->x * k.fr.x;
orientate.y = a->x * k.ri.y + a->y * k.up.y + a->z * k.fo.y + a->x * k.fr.y;
orientate.z = a->x * k.ri.z + a->y * k.up.z + a->z * k.fo.z + a->x * k.fr.z;

return(orientate);
}

最佳答案

谢谢你们,我终于解决了阅读本指南 ( https://steveharveynz.wordpress.com/2012/12/20/ray-tracer-part-two-creating-the-camera ) 的问题,该指南建议在不使用矩阵的情况下标准化坐标(如用户“Spektre”的像素范围)。

附言。

typedef struct  s_vector
{
double x;
double y;
double z;
} t_vector;

typedef struct s_lookat
{
t_vector ri; //right vector
t_vector up; // up
t_vector fo; // foorward
t_vector fr; // eye position
} t_lookat;

关于c - 如何使用 lookAt 矩阵计算光线追踪中的光线?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56586129/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com