Bueno, por fin ver una parte del cuadro. Antes de la clase, hay que darse cuenta mejor. Todo error en la primera clase, ahora llegamos uno por uno para resolver.
Echar un vistazo a la declaración de clase mundial:
Una vez #pragma #ifndef __WORLD_HEADER__ #define __WORLD_HEADER__ # include "geometry.h" # include "viewplane.h" # include "../objects/primitive/sphere.h" # include "../tracers/tracer.h" clase {mundo público: mundo (); mundo (const y WR mundo); ~ mundo (); Construir vacío (); // inicializar los datos vacío render (); // genera add_object void (* Geometrics obj); // añadir objetos geométricos void remove_object (Geometrics * obj); // geometría eliminar objetos número entero get_object_size const (); // número de objetos geométricos, el uso de Kazakh en SingleSphere clase hit_bare_bones_objects ShadeRec (const & ray ray); privado: void open_window (entero HRES const, const vres enteros);// Inicializar ventana, condiciones pueden utilizar DirectX u OpenGL pantalla, se muestra aquí conmigo ppm archivo display_pixel vacío (fila número entero const, const columna entera, const RGBColor y color); // píxeles escritura std :: stringstream ss; // búfer std :: vector <Geometrics *> Objetos; ViewPlane VP; // Ventana clase backgrd_color RGBColor; // color de fondo trazador * tracer_ptr; // ligera colisión y objeto geométrico }; #endif
implementación de la clase:
# include "pch.h" # include "world.h" # include "../tracers/singlesphere.h" mundo :: Mundial (): tracer_ptr (nullptr) {} Mundial :: ~ Mundial () {//写入到ppm文件 std :: ofstream fout; fout.open ( "test.ppm", std :: ios :: out); fout.write (.. ss.str () c_str (), ss.str () size ()); fout.close (); } Mundial :: Mundial (World & const WR) : VP (wr.vp), backgrd_color (wr.backgrd_color), tracer_ptr (wr.tracer_ptr) { objects.clear (); } Void mundo :: build () { vp.set_hres (200); vp.set_vres (100); // 200 * 100像素图片 tracer_ptr = new SingleSphere (this); Geometrics * obj = new Esfera (0, 0,5); obj-> set_color (RGBColor (1, 0, 0)); //球体颜色是红色 add_object (obj); } Mundial vacío :: render () { Ray ray; x LHaga, y; open_window (vp.hres, Point3 SP; ray.o Point3 = (0, 0 ,. 1); / / posiciones de fuente luminosa para (entero r = vp.vres - 1 ; r> = 0; r -) // genera de izquierda a derecha-esquina-esquina, el libro está mal y debe hacerse así, de lo contrario la imagen se invierte es para (C = 0 Integer; c <vp.hres; C ++) { el RGBColor color; X = vp.s * (C - 0,5 * vp.hres); y = vp.s * & lt (R - 0.5 * vp.vres ); ray.d Point3 = (X, y, -1); // sólo se necesita cambiar la dirección de la luz color = tracer_ptr-> trace_ray (ray); display_pixel (R & lt, C, color); } } void mundo :: add_object (Geometrics * obj) { objects.push_back (obj); } void mundo :: remove_object (Geometrics * obj) { for (IT = objects.begin Auto () ;! objects.end IT = (); TI ++) SI ((* TI ) == obj) objects.erase (TI); } get_object_size Entero mundo :: () const { retorno SR; } vacío Mundial :: open_window (hres enteros const, vres enteros const) { ss.clear (); ss << "P3 \ n" << hres << "" << vres << "\ N255 \ n"; // ppm文件头 } vacío Mundial :: display_pixel (fila número entero const, columna entera const, const RGBColor y el co ) { el color RGBColor c =; si (vp.g = 1,0!) c = color.powc (vp.g); número entero IR = (número entero) (255,99 * cr), ig = (número entero) (255,99 * cg), ib = (número entero) (255,99 * cb); ss << << ir "" << << ig "" << ib << "\ n"; //写入颜色值 }
Pues bien, ahora nos fijamos en la función principal llamarlo (después de llamar a la función principal que es lo mismo, por lo que no se repita)
# include "../Common/RayTracingGroundUp/utilities/world.h" int main () { Mundial w; w.build (); w.render (); return 0; }
La imagen resultante es el siguiente (porque estaba abierto bajo la computadora Mac Win7 máquina virtual, por lo que el mac viene ppm para leer el archivo, si Win7 no se abre, por favor utiliza Photoshop y otros software de mapas para abrir en la línea), y finalmente tuvo éxito: