3d 光线跟踪器-计算眼球光线
我正在写一个光线跟踪器(主要是为了好玩),虽然我在过去写过一个,并且花了相当多的时间进行搜索,但似乎没有任何教程能够说明如何在不使用矩阵的情况下计算透视投影中的眼光线 我相信我上一次这样做是通过(潜在地)使用3d 光线跟踪器-计算眼球光线,3d,raytracing,3d,Raytracing,我正在写一个光线跟踪器(主要是为了好玩),虽然我在过去写过一个,并且花了相当多的时间进行搜索,但似乎没有任何教程能够说明如何在不使用矩阵的情况下计算透视投影中的眼光线 我相信我上一次这样做是通过(潜在地)使用四元数类将眼睛向量x/y与摄影机方向向量旋转角度来实现的。这是C++,我在C语言中做这个,虽然这并不重要。 伪码(假设V*Q=变换操作) 我认为实际的问题是,它模拟的是一个球形屏幕表面,而不是一个平面屏幕表面 请注意,虽然我知道如何以及为什么使用叉积、点积、矩阵等,但我实际的3D数学问题解决
四元数类将眼睛向量x/y
与摄影机方向向量旋转角度来实现的。这是C++,我在C语言中做这个,虽然这并不重要。
伪码(假设V*Q=变换操作)
我认为实际的问题是,它模拟的是一个球形屏幕表面,而不是一个平面屏幕表面
请注意,虽然我知道如何以及为什么使用叉积、点积、矩阵等,但我实际的3D数学问题解决技能并不出色
因此:
- 摄像机位置、方向和上方向向量
- 视野
- 屏幕像素和/或子采样分区
为光线跟踪器的x/y像素坐标生成眼睛光线的实际方法是什么
澄清:我正试图计算什么,我只是不擅长用3D数学来计算它,而且我发现没有光线跟踪器代码能够计算单个像素的光线
INPUT: camera_position_vec, direction_vec, up_vec, screen_distance
right_vec = direction_vec x up_vec
for y from 0 to 1600:
for x from 0 to 2560:
# location of point in 3d space on screen rectangle
P_3d = camera_position_vec + screen_distance*direction_vec
+ (y-800)*-up_vec
+ (x-1280)*right_vec
ray = Ray(camera_position_vec, P_3d)
yield "the eye-ray for `P_2d` is `ray`"
x
表示叉积
编辑:
答案假设direction\u vec
是标准化的,这是应该的<代码>右向量
在图片中(似乎左边应该在哪里),但是右向量
不是必需的,如果包含,应该始终与-(向上向量x方向
处于同一方向。此外,这张图片还暗示,当一个人向右移动时,x坐标会增加,而当一个人向下移动时,y坐标会增加。为了反映这一点,这些标志稍有改动。缩放可以通过将等式中的x和y项相乘来执行,或者更有效地,将向量相乘并使用缩放向量
和缩放向量
。然而,变焦与改变视场(FoV)是等价的(因为光圈无关紧要;这是一个完美的针孔相机),而改变视场(FoV)是比任意“变焦”更好处理的数量。有关如何实现FoV的信息,请参见下面我的评论。谢谢。对不起,我应该在这个问题上说得更清楚些。实际上,我脑子里就有这种想法。如何用视场角计算屏幕距离,给定x为0.5到0.5,纵横比不能承受?考虑当你改变<代码>屏幕距离> /代码>(焦距)时会发生什么。当你把它移得越来越近时,图像会变得越来越宽。因此,假设我们需要一个视野FoV
,单位为度。如果考虑右边缘中最大的y值,它将形成一个三角形,这意味着<代码> TAN(FOV/2)=800 /屏幕距离> /代码>。因此,如果我们设置FoV
而不是screen\u distance
,我们将screen\u distance
设置为800/tan(FoV/2)
。当然,人们不会使用固定值,比如2560和1600,但你可以这样做。
INPUT: camera_position_vec, direction_vec, up_vec, screen_distance
right_vec = direction_vec x up_vec
for y from 0 to 1600:
for x from 0 to 2560:
# location of point in 3d space on screen rectangle
P_3d = camera_position_vec + screen_distance*direction_vec
+ (y-800)*-up_vec
+ (x-1280)*right_vec
ray = Ray(camera_position_vec, P_3d)
yield "the eye-ray for `P_2d` is `ray`"