【问题标题】:C++ raytracer and normalizing vectorsC++ 光线追踪器和归一化向量
【发布时间】:2011-12-31 02:04:10
【问题描述】:

到目前为止,我的光线追踪器:

  1. 如果与球体发生碰撞,则发出射线并返回新向量 制作完成

  2. 然后根据与之碰撞的球体[id] 的颜色添加像素颜色。

  3. 重复场景描述中的所有球体。

对于这个例子,让我们说:

sphere[0] = Light source
sphere[1] = My actual sphere

所以现在,在我的嵌套分辨率 for 循环中,我有一个返回的向量,它给出了当前射线与 sphere[1] 碰撞的 xyz 坐标。

我现在想从这个碰撞向量位置发送一条新光线到光的向量位置source sphere[0],这样我就可以根据这个光的颜色/发射来更新像素的颜色。

我已经读过我应该规范化这两个点,并首先检查它们是否指向相反的方向。如果是这样,请不要担心这个计算,因为它在光的阴影中。

所以我的问题是,给定两个 未归一化 向量,我如何检测它们的归一化单位是否指向相反的方向?像这样的点光源,光球上的每个点都有不同的法线方向,这怎么可能呢?这个概念对于定向光来说更有意义。

另外,在我运行此检查后,我应该根据相互关联的两个法线角度进行着色计算,还是应该向光源发出新光线并从那里继续?

【问题讨论】:

    标签: c++ raytracing


    【解决方案1】:

    你可以使用两个向量的点积,如果它们是相反的方向,那就是负数,即一个向量到另一个向量的投影是相反的方向

    【讨论】:

    • 在计算点产生之前是否必须对向量进行归一化?
    • 没关系,因为标准化向量不会改变点积的符号
    • 所以:cos((a.x*b.x+a.y*b.y+a.z*b.z) / (a.raylength * b.raylength))?
    • 点积就是a.xb.x+a.yb.y+a.z*b.z here
    【解决方案2】:

    对于问题 1,我认为您需要向量之间的点积。

    u.v = x1*x2 + y1*y2 + z1*z2

    如果 u.v > 0,那么它们之间的夹角是锐角。

    如果u.v

    如果 0.v == 0,它们正好指向 90 度角。

    但我认为您真正的意思不是对向量进行归一化,而是计算碰撞 xyz 处球体表面法线的角度与从光源到相同 xyz 的角度之间的点积.

    所以如果球体的中心在xs,ys,zs,光源在xl,yl,zl,碰撞在xyz,那么

    向量 1 是 x-xs、y-ys、z-zs 和 向量2是xl-x, yl-y, zl-z

    如果它们之间的点积

    一旦你知道这条光线在非阴影侧击中球体,我认为你需要对视点进行相同的计算,具体取决于光源的位置和视点。如果眼点和光源是同一个点,那么该点积的值可以用于阴影计算。

    如果眼睛和光线在不同的位置,光线可能会照射到眼睛看不到的点(如果有的话,将处于阴影和环境照明中),因此您需要进行相同的矢量计算来替换光线源坐标与眼点坐标,如果点积

    然后,根据从眼睛到表面和表面到光的向量的点积计算阴影。

    好的,在我写这篇文章的时候,有人过来编辑了这个问题,我希望答案仍然很清楚。

    【讨论】:

    • 感谢您的详尽解释。正因为如此,它才能工作。
    • 不客气!不幸的是,表面法线向量和归一化向量之间的相似术语可能会造成混淆。
    猜你喜欢
    • 2019-09-14
    • 2015-02-05
    • 1970-01-01
    • 2014-08-24
    • 1970-01-01
    • 1970-01-01
    • 2011-11-18
    • 2011-10-16
    • 1970-01-01
    相关资源
    最近更新 更多