为什么光线追踪器将球体渲染为椭圆形?

2024-02-29

在过去的几天里,我第一次破解了光线追踪器。然而,有一些怪癖困扰着我,我真的不知道如何锻炼。从一开始就存在的一个是场景中球体的形状 - 渲染时,它们实际上看起来像椭圆形。当然,场景中有透视,但最终的形状仍然显得奇怪。我附上了渲染示例,我遇到的问题在图像左下部分的反射球体上尤其明显。

我真的不知道是什么原因造成的。它可能是射线球相交的代码,如下所示:

bool Sphere::intersect(Ray ray, glm::vec3& hitPoint) {
//Compute A, B and C coefficients
float a = glm::dot(ray.dir, ray.dir);
float b = 2.0 * glm::dot(ray.dir, ray.org-pos);
float c = glm::dot(ray.org-pos, ray.org-pos) - (rad * rad);

// Find discriminant
float disc = b * b - 4 * a * c;

// if discriminant is negative there are no real roots, so return
// false as ray misses sphere
if (disc < 0)
    return false;

// compute q
float distSqrt = sqrt(disc);
float q;
if (b < 0)
    q = (-b - distSqrt)/2.0;
else
    q = (-b + distSqrt)/2.0;

// compute t0 and t1
float t0 = q / a;
float t1 = c / q;

// make sure t0 is smaller than t1
if (t0 > t1) {
    // if t0 is bigger than t1 swap them around
    float temp = t0;
    t0 = t1;
    t1 = temp;
}

// if t1 is less than zero, the object is in the ray's negative direction
// and consequently the ray misses the sphere
if (t1 < 0)
    return false;

// if t0 is less than zero, the intersection point is at t1
if (t0 < 0) {
    hitPoint = ray.org + t1 * ray.dir;
    return true;
} else { // else the intersection point is at t0
    hitPoint = ray.org + t0 * ray.dir;
    return true;
    }
}

或者也可能是另一回事。有人有想法吗?非常感谢!


看来您正在使用非常宽的视野 http://en.wikipedia.org/wiki/Field_of_view_in_video_games(视场)。这会产生鱼眼镜头的效果,使图像扭曲,尤其是边缘。通常,90 度(即任一方向 45 度)之类的角度可以提供合理的图像。

折射实际上看起来相当不错;它是倒置的,因为折射率非常高。好看的图片都在这个问题 https://stackoverflow.com/questions/13386003/glsl-refraction-getting-mapped-upside-down.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么光线追踪器将球体渲染为椭圆形? 的相关文章

随机推荐

  • 使用 Play Framework 检索应用程序内的端口号

    我的系统上有两个 Play 框架 Web 应用程序在端口 9001 和 9002 上运行 我想知道是否有任何方法可以从我的 Java 代码中检索它们在哪个端口上运行 这可能吗 是的 你可以这样获取端口 int port Integer pa
  • 使用 bitbucket 在 Azure 上部署 Angular2 项目时出现 package.json 错误

    我在 azure 上部署 angular2 应用程序时遇到问题 我在以下行中收到错误 engines node 6 2 1 我给出的版本是 WEBSITE NODE DEFAULT VERSION 的值为 6 2 1 任何对此有想法的人请分
  • 字符串中包含组中的任何字符吗?

    我有一组字符 等 我也有一个字符串 可以说 这是我的字符串 我的字符串 我想检查字符串中是否存在任何字符 这不是检查子字符串 而是检查集合中的字符 我可以这样做 my str find or my str find or my str fi
  • 如何创建文件并写入文件?

    最简单的方法是什么用 Java 创建并写入 文本 文件 https docs oracle com javase tutorial essential io file html 请注意 下面的每个代码示例都可能会抛出异常IOExceptio
  • 将一组新数据写入 Plist 而不是覆盖它

    我试图获取一个 plist 来存储多组数据 但每次保存 使用 ActionSheet 中的按钮 时 它都会覆盖前一组数据 我想添加多个 朋友 及其数据 我不太热衷于使用 Core Data 所以我想知道如何使用 Plist 来做到这一点 这
  • NSAsynchronousFetchRequest - 应该在主线程上显式完成更新

    我正在创建一个 NSAsynchronousFetchRequest 其中有一个完成块 我见过各种示例 其中一些包括在主线程上使用调度队列 而另一些则没有 例如 Ray Wenderlich 核心数据手册不会在主线程上调用结果 执行结果时我
  • React Native 堆栈跟踪

    I have React Native App与 Firebase Crashlytics 关联 问题是 firebase 发送不可读的堆栈跟踪 如下所示 有任何方法可以读取此类错误 我只想知道什么时候抛出错误 这是我的堆栈跟踪 致命异常
  • 启用服务器端加密的跨账户访问 AWS SQS

    上下文 AWS 账户 2 中有一个 API 将 SQS url 作为其输入之一并向其发布输出 帐户 1 的所有者希望将此 API 与他自己的 SQS 队列一起使用 账户 1 有一个启用了 SSE KMS 的 SQS 队列 账户 1 的所有者
  • 构建 Qt - NMAKE:致命错误 U1077:“cd”:返回代码“0x2”

    我正在尝试使用 msvc2015 构建带有静态链接的 Qt5 5 但出现以下错误 实际上有很多错误 但我只列出了一些 它们都完全相同 K Archivos de programa Microsoft Visual Studio 14 0 V
  • pack://application:,/ResourceFile.xaml 永远不会工作

    我从来没有能够让资源字典的这种参考格式发挥作用 我缺少什么 设想 创建并组装一些用户控件 在根目录下有所说的文件 根 主题 ColorThemes xaml ColorThemes xaml 文件的构建操作设置为Resource http
  • 覆盖本地资源字典中的系统颜色

    我试图隐藏指示 WPF 中选择的视觉提示ListBox 这个答案 https stackoverflow com questions 4343793 how to disable highlighting on listbox but ke
  • 使用多个类实现一个接口

    这个问题是在一次采访中问我的 我厌倦了在这里谷歌搜索 我有一个包含 100 个方法的接口 我不想在一个类中实现所有这 100 个方法 有没有一种方法可以通过使用多个类来实现这 100 个方法而不重复实现 例如 A 类 仅 实现前 10 个方
  • Android JSON HttpClient 使用 HttpResponse 将数据发送到 PHP 服务器

    我目前正在尝试从 Android 应用程序发送一些数据到 php 服务器 两者都由我控制 应用程序中的表单上收集了大量数据 这些数据被写入数据库 这一切都有效 在我的主代码中 首先我创建一个 JSONObject 在本例中我已将其删减 JS
  • Scala lambda 函数与 map 函数

    我定义以下变量x val x Array 3 2 4 5 它的类型是Array Int Int 当我执行以下操作时 x map a Int b Int gt a b 我收到以下错误 console 28 error type mismatc
  • .Net MVC - 从视图中访问数据库不仅仅是糟糕的做法? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我见过一些开发人员实例化从视图内访问数据库的模型 通常 当他们想要访问 html 部分时 他们会这样做 并且他们只是在视图中创建一个新的视图模型
  • 有没有办法在 Scala 中使用“type”字作为变量名?

    在我的实践中 变量 参数经常用于存储某种类型 通常作为枚举值 在名称中指定实体类通常是没有意义的 就像当函数仅用于处理用户时的 userType 一样 有没有办法可以使用 类型 一词来满足我的需求 而不是使用 tipe kind somet
  • 如何从多维数组中提取列?

    有谁知道如何在Python中从多维数组中提取列 gt gt gt import numpy as np gt gt gt A np array 1 2 3 4 5 6 7 8 gt gt gt A array 1 2 3 4 5 6 7 8
  • 如何在 Struts 2 中的 JSP 页面上显示数据库记录列表(通过 Hibernate 检索)?

    我正在尝试使用 Hibernate 在 Struts 2 中的 JSP 页面中显示数据库记录 我已经成功完成检索部分 但无论我做什么 我似乎都无法在JSP页面中显示数据 我尝试过在互联网上找到的各种解决方案 但无法理解似乎是什么问题 我可以
  • 在端口 80 上运行 Sinatra

    我安装了 Sinatra 它可以工作 但默认使用端口 4567 我希望它在端口 80 上运行 为了让它在端口 80 上工作 我尝试了以下方法 require rubygems require rack handler webrick req
  • 为什么光线追踪器将球体渲染为椭圆形?

    在过去的几天里 我第一次破解了光线追踪器 然而 有一些怪癖困扰着我 我真的不知道如何锻炼 从一开始就存在的一个是场景中球体的形状 渲染时 它们实际上看起来像椭圆形 当然 场景中有透视 但最终的形状仍然显得奇怪 我附上了渲染示例 我遇到的问题