2013-05-17 1 views
1

Мне нужно было создать изображение, которое представляет собой черный круг, черное существо (0, 0, 0) и белое существо (1, 1, 1), но я продолжаю получать полностью черное изображение. Вот все, что мой код:Почему мое изображение, прорисованное лучом, полностью черное?

#include "cast.h" 
#include "collisions.h" 
#include <stdio.h> 
#include "math.h" 

int cast_ray(struct ray r, struct sphere spheres[], int num_spheres) 
{ 
    int isFound; 
    struct maybe_point mp; 
    isFound = 0; 

    for (int i = 0; i < num_spheres; i++) 
    { 
     mp = sphere_intersection_point(r, spheres[i]); 

     if (mp.isPoint == 1) 
     { 
     isFound = 1; 
     } 
     else 
     { 
     isFound = 0; 
     } 
    } 
    return isFound; 
} 

void print_pixel(double a, double b, double c) 
{ 
    int i, j, k; 

    i = a * 255; 
    j = b * 255; 
    k = c * 255; 

    printf("%d %d %d ", i, j, k); 
} 

void cast_all_rays(double min_x, double max_x, double min_y, double max_y, 
        int width, int height, struct point eye, 
        struct sphere spheres[], int num_spheres) 
{ 
    double width_interval, height_interval, y, x; 
    int intersect; 

    width_interval = (max_x - min_x)/width; 
    height_interval = (max_y - min_y)/height; 

    for (y = max_y; y > min_y; y = y - height_interval) 
    { 
     for (x = min_x; x < max_x; x = x + width_interval) 
     { 
     struct ray r; 
     r.p = eye; 
     r.dir.x = x; 
     r.dir.y = y; 
     r.dir.z = 0.0; 

     intersect = cast_ray(r, spheres, num_spheres); 

      if (intersect != 0) 
      { 
       print_pixel (0, 0, 0); 
      } 
      else 
      { 
       print_pixel (1, 1, 1); 
      } 
     } 

Я уже имел функции, которые я знаю, являются правильными, которые находят, пересекает ли не луч со сферой. Функция, которую я использовал для нахождения точек пересечения, была в функции cast_ray.

sphere_intersection_point(r, spheres[i]); 

Функция print_pixel переводит целые значения путем умножения их максимальное значение цвета, которое 255.

И функция cast_all_rays отбрасывает лучи во всю сцену от наших глаз (проходящей через все х координаты перед изменением y). Если луч пересекается со сферой, пиксель является черным, таким образом, образуя черный круг в конце.

А вот пределы для х, у, и радиус (Примечание: Я использую FORMAT PPM):

Eye at <0.0, 0.0, -14.0>. 
A sphere at <1.0, 1.0, 0.0> with radius 2.0. 
A sphere at <0.5, 1.5, -3.0> with radius 0.5. 
min_x at -10, max_x at 10, min_y of -7.5, max_y at 7.5, width=1024, and height=768. 

Мне нужно, чтобы сформировать изображение черного круга, но я держу получив изображение, полностью черное. У меня такое чувство, что проблема лежит внутри функции cast_all_rays, но я просто не могу найти, что это такое. Помощь приветствуется! Благодарю.

И только в случае, если что-то пошло не так с моего тестирования, вот мой test.c файл для cast_all_rays:

#include "collisions.h" 
#include "data.h" 
#include "cast.h" 
#include <stdio.h> 

void cast_all_rays_tests(void) 
{ 
    printf("P3\n"); 
    printf("%d %d\n", 1024, 768); 
    printf("255\n"); 

    double min_x, max_x, min_y, max_y; 
    int width, height; 
    struct point eye; 
    struct sphere spheres[2]; 

    eye.x = 0.0; 
    eye.y = 0.0; 
    eye.z = -14.0; 
    spheres[0].center.x = 1.0; 
    spheres[0].center.y = 1.0; 
    spheres[0].center.z = 0.0; 
    spheres[0].radius = 2.0; 
    spheres[1].center.x = 0.5; 
    spheres[1].center.y = 1.5; 
    spheres[1].center.z = -3.0; 
    spheres[1].radius = 0.5; 
    min_x = -10; 
    max_x = 10; 
    min_y = -7.5; 
    max_y = 7.5; 

    cast_all_rays(min_x, max_x, min_y, max_y, width, height, eye, spheres, num_spheres); 
} 

int main() 

{ 
    cast_all_rays_tests(); 

    return 0; 
} 

ответ

0

Не уверен, если это проблема, вы испытываете, но вы должны установить только isFound если вы пересекаете сферу. Не устанавливайте его, если вы не пересекаетесь. В противном случае ваше изображение будет определяться только последней сферой в списке.

if (mp.isPoint == 1) 
    { 
    isFound = 1; 
    } 
    //else 
    //{ 
    // isFound = 0; 
    //} 

Поскольку ваше изображение полностью черное, похоже, ваш код пересечения заглушки или ваше поле зрения слишком узкое. Если у вас нет радости от вышеуказанного изменения, возможно, вам следует опубликовать данные о ваших x- и y-ограничениях, о положении глаз и местоположении и радиусе сферы.

Еще одна вещь, которую я заметил, - r.dir.z = 0.0. Вычитаете ли вы положение глаз из этого, чтобы получить направление, или это ваше истинное направление луча? Конечно, вам нужно дать ненулевое z-направление. Обычно вы устанавливаете x и y на основе вашей плоскости обзора и обеспечиваете постоянную z, такую ​​как 1 или -1.

[править]

Чтобы сделать его более ясным из приведенных ниже комментариев, я считаю, что вы не правильно настроить направление луча. Вместо этого вы просто указали, что направление является пиксельным положением плоскости зрения, игнорируя положение глаз. Было бы более обычным:

 struct ray r; 
    r.p = eye; 
    r.dir.x = x - eye.x; 
    r.dir.y = y - eye.y; 
    r.dir.z = 0.0 - eye.z; 
+0

Да, изображение по-прежнему остается черным. :(Я выложу пределы выше. – Karen

+0

Проверьте мое последнее изменение о нулевом направлении z. – paddy

+0

Хм ... ох! В нем говорится, что границы прямоугольника вида - min_x, max_x, min_y и max_y (z - 0). Подождите минуту, поэтому координата z, на которую они ссылаются, на самом деле НЕ является координатой z направления луча? – Karen