Трекинг лучей: сфера не появляется. Правильно ли пересечение?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Трекинг лучей: сфера не появляется. Правильно ли пересечение?

Сообщение Anonymous »

Я сейчас занимаюсь лучей. Для начала только сфера лучей. При попытке отобрать сцену с тремя сферами, которые два, как ожидалось. Третий этого не сделал. На изображении, вы можете увидеть небольшую круговую черную область, покрывающую верхнюю область зеленой сферы. Это часть третьей сферы, с теоретически, должна быть полностью отображена в красном цвете. И это не так, потому что он не выполняет тест на пересечение. Проблема в том, что после прочтения его пару раз код пересечения кажется правильным. И другие сферы в порядке. Чтобы сделать вещи хуже всего, я напечатал значение каждой соответствующей переменной, связанной с процессом пересечения, и все кажется нормальным. Так что я больше не знаю, есть ли ошибка или результат действительно верен. Беллоу, я прикрепил полную самопоставленную экзамену на случай, если кто -то захочет осмотреть источник. Он печатает значение переменных в двух положениях экрана для трех сфер. Например, вот результаты для сферов № 1 (красный) и номер 3 (зеленый) для координат 670 285: < /p>
center: 700 550 100
ray_ori: 670 285 0
radius_squared: 10000
hipt: 30 265 100
cat_adj_len: 100
cad_op_len_sqr = hipt*hipt - cat_adj_len*cat_adj_len: 71125

center: 650 300 400
ray_ori: 670 285 0
radius_squared: 40000
hipt: -20 15 400
cat_adj_len: 400
cad_op_len_sqr = hipt*hipt - cat_adj_len*cat_adj_len: 625
cat_adj_sml_len_sqr (= squared_radius - cad_op_len_sqr): 39375
t0 (= cat_adj_len - sqrt (cat_adj_sml_len_sqr)): 201.569
closest_sphere: 2
Color: 0 255 0
< /code>
#include
#include
#include
#include
#define recursion_limit 1

using namespace std;

class TGAManager : ofstream {
public:
TGAManager (int _width, int _height, int _bpp) : width(_width), height(_height), bpp (_bpp), _const(255) {}
void setHeader ();
void fillTGA ();
ofstream ofs;
private:
int width,height,bpp,_const;
};

void TGAManager::setHeader () {
ofs.open ("z.tga", ios::binary);
ofs.put (0), ofs.put(0), ofs.put(2), ofs.put(0), ofs.put(0), ofs.put(0);
ofs.put (0), ofs.put(0), ofs.put(0), ofs.put(0), ofs.put(0), ofs.put(0);
ofs.put (width & _const), ofs.put(width >> 8);
ofs.put (height & _const), ofs.put (height >> 8);
ofs.put (bpp), ofs.put(0);
}

void TGAManager::fillTGA () {
for (int i=0; i

Подробнее здесь: https://stackoverflow.com/questions/797 ... on-correct
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»