10

ここ数日、初めてレイトレーサーをハッキングしています。しかし、私を悩ませるいくつかの癖があり、うまくいく方法が本当にわかりません. 最初から存在していたのは、シーン内の球の形状です。レンダリングすると、実際には楕円のように見えます。もちろん、シーンには遠近感がありますが、最終的な形はまだ奇妙に見えます. サンプル レンダリングを添付しました。問題は、画像の左下部分にある反射球で特に顕著です。

サンプル画像

何が原因なのかよくわかりません。次のような光線と球体の交差コードである可能性があります。

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;
    }
}

または、それは別のことかもしれません。誰にもアイデアはありますか?本当にありがとう!

4

1 に答える 1

7

非常に広い視野(FoV) を使用しているようです。これにより、魚眼レンズの効果が得られ、特にエッジに向かって画像が歪みます。通常、90 度 (つまり、いずれかの方向に 45 度) 程度で妥当な画像が得られます。

屈折は実際には非常によく見えます。屈折率が非常に高いため、反転しています。この質問には素敵な写真があります。

于 2012-12-28T19:39:08.550 に答える