我正在写一个射线追踪器(主要是为了好玩),虽然我在过去写过一个,并且花了相当长的时间来搜索,但是没有一个教程可以在不使用矩阵的情况下用透视投影来计算光线。
我相信上一次我这样做是通过(潜在的)低效率地旋转眼睛矢量x/y度从相机方向矢量使用一个Quaternion类。这是在C++,我正在用C#做这件事,尽管这并不重要。
伪码(假设V*q=变换运算)
yDiv = fovy / height
xDiv = fovx / width
for x = 0 to width
for y = 0 to height
xAng = (x / 2 - width) * xDiv
yAng = (y / 2 - height) * yDiv
Q1 = up vector, xAng
Q2 = camera right vector, yAng
Q3 = mult(Q1, Q2)
pixelRay = transform(Q3, camera direction)
raytrace pixelRay
next
next我认为实际的问题是,它模拟的是一个球形屏幕表面,而不是一个平面屏幕表面。
请注意,虽然我知道如何和为什么使用交叉产品,点产品,矩阵等,我的实际三维数学问题解决技巧不是很棒。
因此:
up-vector
为x/y像素坐标产生x/y射线的实际方法是什么?
澄清:,我正试图计算什么,我只是不擅长想出三维数学来计算它,而且我发现没有射线追踪代码,我似乎有计算单个像素的眼睛射线所需的代码。

发布于 2011-05-10 02:00:36

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_vec是规范化的,这是应该的。right_vec在图片中(似乎左边应该在哪里),但right_vec并不是必需的,如果包括right_vec,则应该始终与-(up_vec x direction_vec)的方向相同。此外,这幅图暗示,x-coord随着你的正确而增加,y-coord随着你的下降而增加。这些迹象略有改变,以反映这一点。变焦可以通过将方程中的x项和y项相乘来执行,或者更有效地乘以向量并使用scaled_up_vec和scaled_right_vec。然而,变焦是等价的(因为光圈并不重要;这是一个完美的针孔相机)改变视场(FoV),这是一个比任意“缩放”更好的处理数量。有关如何实现FoV的信息,请参阅下面的评论。
https://stackoverflow.com/questions/5944109
复制相似问题