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