Ray tracer не рендеринг основы c сфера - PullRequest
0 голосов
/ 03 февраля 2020

Я только что установил камеру и пытаюсь отобразить красную сферу на синем фоне, но все, что я получаю, это синий фон. Я использую скретч пиксель и трассировку лучей за один выходной (поэтому код может выглядеть примерно так). Я не был уверен в настройке части камеры за одну неделю (так как каждый другой источник говорил что-то другое), поэтому я попытался реализовать скретч-пиксель, но он с треском провалился.

main. cpp

#include <iostream>
#include <math.h>
#include "ray.h"
#include "vec.h"
#include <cmath>
#include <cstdio>
using namespace std;

const int width = 200, height = 100;
int imgAspectRatio = width/height;
constexpr double M_PI = 3.14159265358979323846;
float FOV = M_PI;//for basic ray testing

vec CameraSpace(int i, int j)
{
    float px, py;
    px = (i + 0.5)/width;
    py = (j + 0.5)/height;
    float pxScreen = 2*px - 1;
    float pyScreen = 1- 2*py;
    float pxCamera = pxScreen * imgAspectRatio * tan(FOV/2);
    float pyCamera = pyScreen * imgAspectRatio * tan(FOV/2);
    vec a = vec(pxCamera, pyCamera, -1);
    return unit_vector(a);
}

bool hitSphere( const vec& centre, float radius, const ray& r)
{
    vec oc = r.A()-  centre;
    float a = dot(r.B(), r.B());
    float b = 2.0 * dot(oc, r.B());
    float c = dot(oc, oc) - radius*radius;
    float discriminant = b*b - 4*a*c;
    return (discriminant > 0);
}

vec color(const ray& r)
{
    if(hitSphere(vec(0, 0, -1), 0.5, r))
        return vec(1, 0, 0);
    else
       return vec(0, 0, 1);
}

int main()
{
    FILE *fp;
    fp = fopen("render21.ppm", "wb");
    (void) fprintf(fp, "P6\n%d %d\n255\n", width, height);
    vec origin(0, 0, 0);
    for(int j = height - 1 ; j >= 0; j--)
    {
        for(int i = 0; i < width; i++)
        {
            ray r(origin, CameraSpace(i, j) - origin);
            vec m = color(r);
            static unsigned char img[3];
            img[0] = int(255.99*m.xCoord());
            img[1] = int(255.99*m.yCoord());
            img[2] = int(255.99*m.zCoord());
            (void) fwrite(img, 1, 3, fp);
        }
    }
    (void)fclose(fp);
    return 0;
}

ray.h

#ifndef RAY_H
#define RAY_H
#include "vec.h"
#include <cmath>
class ray
{
        public:
        vec origin;
        vec dir;
        ray();
        vec A() const{return origin;};
        vec B() const{return dir;};
        ray(const vec& v1, const vec& v2);
        vec rayCreate(float t) const;
};

#endif // RAY_H

ray. cpp

#include "ray.h"
#include "vec.h"
#include <cmath>
ray::ray()
{
}

ray::ray(const vec& v1, const vec& v2)
{
    origin = v1;
    dir = v2;
}

vec ray::rayCreate(float t) const
{
    return (origin + t*dir);
}

В функции пространства камеры я преобразовал координаты пикселей в ND C а затем на камеру космического изображения самолета, с учетом FOV

...