0

У меня проблемы с программой трассировки лучей. Исходный код, который я использовал, был из учебника по youtube - https://www.youtube.com/watch?v=k_aRiYSXcyo (учебник по пробиванию калеба по трассировке лучей).Как объявить переменные в объектно-ориентированной программе трассировки лучей, когда большинство из них являются векторами и объявлениями камеры?

Затем я переделал код в main.cpp в объектно-ориентированный код с помощью Visual Studio.

Задача заключалась в том, чтобы инкапсулировать функции и вычисления, чтобы затем использовать OpenMP (в Visual Studio) или (в Visual Studio), чтобы я мог многопоточно обрабатывать всю программу.

Но прежде чем я это сделаю, у меня возникла проблема с конкретными объявлениями переменных. Большинство из них - объявления векторов из моего заголовочного файла Vect.h и файла Camera.h.

Вот код от main.cpp, а точнее - только декларации. Я не буду публиковать функции и вычисления алгоритма, так как они работают, и у меня нет проблем с ними.

класс, в котором я объявить некоторые из переменных и функций метода

//thread class 
class Thread 
{ 
public: 

    void UPrightRend(); 
    void UPleftRend(); 
    void DownrightRend(); 
    void DownleftRend(); 
    void define(); 
    void calcVect(int x, int y); 
    void calcColor(); 
    void saveimg(const char *filename); 
    int winningObjectIndex(vector<double> object_intersections); 
    Color getColorAt(Vect intersection_position, Vect intersecting_ray_direction, vector<Object*> scene_objects, int index_of_winning_object, vector<Source*> light_sources, double accuracy, double ambientlight); 

private: 

    //basic variables 
    int dpi = 72; 
    double sWidth = 1000; 
    double sHeight = 800; 
    int n = sWidth*sHeight; 
    RGBType *pixels = new RGBType[n]; 

    //aadepth sends out n number of pixels/rays that hit one pixels and then reflect to other pixels are return a value that is then averaged 
    static const int aadepth = 5; 
    double aspectratio = sWidth/sHeight; 
    double ambientlight = 0.2; 
    double accuracy = 0.000001; 

    int thisone, aa_index; 
    double xamnt, yamnt; 

    Vect camdir; 
    Vect camright; 
    Vect camdown; 
    Camera scene_cam; 

    vector<Source*> light_sources; 

    vector<Object*> scene_objects; 

    //start with a blank pixel 
    double tempRed[aadepth*aadepth]; 
    double tempGreen[aadepth*aadepth]; 
    double tempBlue[aadepth*aadepth]; 

}; 

и торможения других переменных.

void Thread::define() 
{ 

    //Calling Vect.h and establishing the XYZ positions 
    Vect O(0, 0, 0); 
    Vect X(3, 0, 3.5); 
    Vect Y(0, 1, 0); 
    Vect Z(0, 0, 1); 
    Vect P(5.5, 0, 3.5); 
    Vect R(0, -3, 0); 
    Vect M(7, 0, -5); 

    Vect new_sphere_location(2, 0, 0); 

    Vect campos(4, 1, -4); 

    Vect look_at(0, 0, 0); 
    Vect diff_btw(campos.getVectX() - look_at.getVectX(), campos.getVectY() - look_at.getVectY(), campos.getVectZ() - look_at.getVectZ()); 

    //camera direction and position 
    camdir = diff_btw.negative().normalize(); 
    camright = Y.crossProduct(camdir).normalize(); 
    camdown = camright.crossProduct(camdir); 
    Camera scene_cam(campos, camdir, camright, camdown); 

    //color of objects and planes 
    Color white_light(1.0, 1.0, 1.0, 0); 
    Color pretty_green(0.25, 0.25, 0.95, 0.5); 
    Color maroon(0.5, 0.25, 0.25, 0.5); 
    Color tile_floor(1, 1, 1, 2); 
    Color gray(0.5, 0.5, 0.5, 0); 
    Color black(0.0, 0.0, 0.0, 0); 

    //light color and position 
    Vect light_position(-7, 10, -10); 
    Light scene_light(light_position, white_light); 
    light_sources.push_back(dynamic_cast<Source*>(&scene_light)); 

    //scene objects 
    Sphere scene_sphere(O, 0.85, pretty_green); 
    Sphere scene_sphere2(new_sphere_location, 0.5, maroon); 
    Plane scene_plane(Y, -1, tile_floor); 
    Plane scene_plane2(P, -1, gray); 
    Plane scene_plane3(X, 1, gray); 
    Plane scene_plane4(R, -1, tile_floor); 
    Plane scene_plane5(M, -1, black); 

    scene_objects.push_back(dynamic_cast<Object*>(&scene_sphere)); 
    scene_objects.push_back(dynamic_cast<Object*>(&scene_sphere2)); 
    scene_objects.push_back(dynamic_cast<Object*>(&scene_plane)); 
    scene_objects.push_back(dynamic_cast<Object*>(&scene_plane2)); 
    scene_objects.push_back(dynamic_cast<Object*>(&scene_plane3)); 
    scene_objects.push_back(dynamic_cast<Object*>(&scene_plane4)); 
    scene_objects.push_back(dynamic_cast<Object*>(&scene_plane5)); 

} 

So. Когда я вызываю функцию define() в функции main() с объектом, я получаю черный экран как вывод изображения. Когда я вызываю функцию define() в функции вычисления, программа сразу же запускается при запуске.

Если я переместил содержимое функции define() в класс private:, я получаю ошибки для объявлений.

Все переменные в define() должны быть видны, но я не знаю, как это сделать.

Как исправить это? Это не работает, и я просто получаю изображение на черном экране или просто падает.

Извините, если что-то неясно (это мой первый вопрос о stackoverflow).

Спасибо!

+0

В чем вопрос? – immibis

+0

Как исправить это. Я хочу иметь изображение, и оно не работает – mnestorov

ответ

0

Я точно не знаю, где проблема, вызывающая черный экран, но я не удивлен крушением.

Вы должны учитывать, что переменные (и относительные значения), объявленные в методе, как в define(), теряются, когда метод завершает его выполнение.

Так что смотрите следующий код

Sphere scene_sphere(O, 0.85, pretty_green); 
Sphere scene_sphere2(new_sphere_location, 0.5, maroon); 
Plane scene_plane(Y, -1, tile_floor); 
Plane scene_plane2(P, -1, gray); 
Plane scene_plane3(X, 1, gray); 
Plane scene_plane4(R, -1, tile_floor); 
Plane scene_plane5(M, -1, black); 

scene_objects.push_back(dynamic_cast<Object*>(&scene_sphere)); 
scene_objects.push_back(dynamic_cast<Object*>(&scene_sphere2)); 
scene_objects.push_back(dynamic_cast<Object*>(&scene_plane)); 
scene_objects.push_back(dynamic_cast<Object*>(&scene_plane2)); 
scene_objects.push_back(dynamic_cast<Object*>(&scene_plane3)); 
scene_objects.push_back(dynamic_cast<Object*>(&scene_plane4)); 
scene_objects.push_back(dynamic_cast<Object*>(&scene_plane5)); 

Вы объявляете семь локальных переменных (scene_sphere, scene_sphere2 и т.д.) и в следующем добавить их указатель (я полагаю, что Object является базовым классом для Sphere и Plane) в член класса (scene_objects).

Когда define() завершает выполнение, семь переменных (scene_sphere, scene_sphere2 и т. Д.) Заканчивают свою жизнь, и их память освобождается. Таким образом, семь указателей в scene_objects указывают на освобожденную стек памяти, которая может быть переработана для других переменных.

Когда вы пытаетесь (если попытаетесь) использовать один из семи указателей, очень вероятно, что программа выйдет из строя.

Такая же проблема с

Light scene_light(light_position, white_light); 
light_sources.push_back(dynamic_cast<Source*>(&scene_light)); 

Я полагаю, вы должны использовать динамическое выделение (new) таким образом

light_sources.push_back(new Light(light_position, white_light)); 

// ... 

scene_objects.push_back(new Sphere(O, 0.85, pretty_green)); 
scene_objects.push_back(new Sphere(new_sphere_location, 0.5, maroon)); 
scene_objects.push_back(new Plane(Y, -1, tile_floor)); 
scene_objects.push_back(new Plane(P, -1, gray)); 
scene_objects.push_back(new Plane(X, 1, gray)); 
scene_objects.push_back(new Plane(R, -1, tile_floor)); 
scene_objects.push_back(new Plane(M, -1, black)); 

так заостренный объект может пережить конец define().

Но не забудьте указать delete, если это необходимо, если вы не хотите утечки памяти.

Или, лучше, вы можете использовать умные указатели (std::unique_ptr на примере) вместо простых указателей.

p.s .: извините за мой плохой Английский

 Смежные вопросы

  • Нет связанных вопросов^_^