首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >光线追踪器-计算眼睛射线

光线追踪器-计算眼睛射线
EN

Stack Overflow用户
提问于 2011-05-10 01:01:47
回答 1查看 5.1K关注 0票数 10

我正在写一个射线追踪器(主要是为了好玩),虽然我在过去写过一个,并且花了相当长的时间来搜索,但是没有一个教程可以在不使用矩阵的情况下用透视投影来计算光线。

我相信上一次我这样做是通过(潜在的)低效率地旋转眼睛矢量x/y度从相机方向矢量使用一个Quaternion类。这是在C++,我正在用C#做这件事,尽管这并不重要。

伪码(假设V*q=变换运算)

代码语言:javascript
复制
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

  • Field of view

  • 屏幕像素和/或次采样除法

为x/y像素坐标产生x/y射线的实际方法是什么?

澄清:,我正试图计算什么,我只是不擅长想出三维数学来计算它,而且我发现没有射线追踪代码,我似乎有计算单个像素的眼睛射线所需的代码。

EN

回答 1

Stack Overflow用户

回答已采纳

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

代码语言:javascript
复制
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_vecscaled_right_vec。然而,变焦是等价的(因为光圈并不重要;这是一个完美的针孔相机)改变视场(FoV),这是一个比任意“缩放”更好的处理数量。有关如何实现FoV的信息,请参阅下面的评论。

票数 13
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5944109

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档