IPB
ЛогинПароль:

> Внимание!

1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным.
В описании темы указываем язык!!!

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

 
 Ответить  Открыть новую тему 
> Трассировка лучей, OpenGl, C++
сообщение
Сообщение #1


Новичок
*

Группа: Пользователи
Сообщений: 16
Пол: Мужской
Реальное имя: Сергей

Репутация: -  1  +


Необходимо реализовать трассировку лучей на OpenGl и C++, задача вроде проста, есть базовая сфера( радиус =1, центр в начале координат) необходимо ее отрисовать. У меня почти получилось, только вот точки пересечения не получается найти, по моему что-то с заданием направления луча. Может кто-то сталкивался с этим? Буду благодарен за код=)



void Reshape(int width, int height)
{if (width>height)
glViewport((width-height)/2,0,height,height);
else glViewport(0,(height-width)/2,width,width);
//glEnable(GL_DEPTH_TEST);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(-10,10,-10,10);
glMatrixMode(GL_MODELVIEW);
}
void Display(void)
{
glClear(GL_COLOR_BUFFER_BIT);
Ray myray;
myray.start.x=0;
myray.start.y=0;
myray.start.z=5;
for(float i=0;i<200;i++)
for(float j=0;j<200;j++)
{
Point t;
t.x=-10+i/20;
t.y=10-j/20;
t.z=0;
//FILE * f=fopen("output.txt","r");
myray.dir.x=t.x-myray.start.x; //задаю направление луча, думаю ошибка где-то здесь, хотя //может неправильно перевожу экранные координаты
myray.dir.y=t.y-myray.start.y;
myray.dir.z=t.z-myray.start.z;
//fprintf(f,"x=%f, y=%f, z=%f\n",myray.dir.x,myray.dir.y,myray.dir.z);
float A=sqr(myray.dir,myray.dir);
float B=sqr(myray.dir,myray.start);
float C=sqr(myray.start,myray.start)-1;
float D=B*B-4*A*C;
if (D>0)
printf("i=%d j=%d %f\n",i,j,D);
if (D<0)
{
glColor3f(0,0,0);
glRecti(i,j,i+1,j+1);
}
else
{
//float t1,t2;
//t1=(-B-sqrt(D))/(2*A);
//t1=(-B+sqrt(D))/(2*A);
glColor3f(1,1,1);
glRecti(i,j,i+1,j+1);
}
//glFlush();
}
glFlush();
}



Может кто знает, где можно найти книгу Лорен Хейни "Построение изображений метод слежения луча"?

Сообщение отредактировано: Lapp -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Гость






Цитата
У меня почти получилось
Чего ж ты не показал, что именно у тебя получилось?
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Новичок
*

Группа: Пользователи
Сообщений: 16
Пол: Мужской
Реальное имя: Сергей

Репутация: -  1  +


Все добавил код
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Гость






Странно. В Reshape используешь функции из GLUT-а, а рисуешь сферу вручную, вместо того, чтоб сделать вот так:
void Display(void)
{
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
glutSolidSphere(1.0, 64, 64); // GLUT - значит GLUT, либо обходись без него везде...
glFlush();
}

(твой код запустить не могу, что такое у тебя Ray - без понятия).
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Новичок
*

Группа: Пользователи
Сообщений: 16
Пол: Мужской
Реальное имя: Сергей

Репутация: -  1  +


Так сферу конечно нарисовать мог, но мне именно надо использовать трассировку, на сферу вообще можно не обращать внимание, я ее использую, чтобы понять как алгоритм можно реализовать
Цитата
(твой код запустить не могу, что такое у тебя Ray - без понятия).

struct Point
{
float x;
float y;
float z;
};
struct Ray
{
Point start;
Point dir;
};
float sqr(Point p1, Point p2)
{
return p1.x*p2.x+p1.y*p2.y+p1.z*p2.z;
}
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Гость






Значит, смотри...

Вот - основа: http://www.codermind.com/articles/Raytrace...First-rays.html
(тут - само объяснение того, что происходит при RayTracing-е)

Я чуть-чуть доработал код, чтобы он не сбрасывал изображение в файл, а выводил его на экран. И избавился от STL-ных контейнеров... Вот что получилось:

Прикрепленный файл  arith.txt ( 2.49 килобайт ) Кол-во скачиваний: 1195
(векторная математика, нужно переименовать в arith.h)

Прикрепленный файл  main.cpp ( 4.65 килобайт ) Кол-во скачиваний: 1226
(а это сам код)
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Новичок
*

Группа: Пользователи
Сообщений: 16
Пол: Мужской
Реальное имя: Сергей

Репутация: -  1  +


Большое спасибо. Буду разбираться с кодом.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


Профи
****

Группа: Пользователи
Сообщений: 865
Пол: Мужской
Реальное имя: Вячеслав

Репутация: -  20  +


А где взять файлик glut.h ?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #9


Гость






Здесь: ftp://ftp.sgi.com/sgi/opengl/glut/

Там есть файл, название которого начинается с glutdlls... А дальше уж выбирай, что качать smile.gif Либо бету 3.7, либо стабильную 3.6, либо альфу... У меня 3.6, если что...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #10


Профи
****

Группа: Пользователи
Сообщений: 865
Пол: Мужской
Реальное имя: Вячеслав

Репутация: -  20  +


спасибо, скачал этот
Цитата
12/11/1997 12:00 1,757,854 glut-3.6.tar.gz
smile.gif Сколько там файлов....
если подключая файл указать его в кавычках, поиск идет в папке с .exe, а если в угловых скобках то в сисетмной папке (или где-то там). Интересно, где это "где-то там" ?

Сообщение отредактировано: Client -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #11


Гость






Цитата
скачал этот
Ну, и зачем тебе это все? Я ж говорил, что тебе надо только DLL-ки. Там всего 5 файлов... и размер у него раз в 10 меньше.

Цитата
если подключая файл указать его в кавычках, поиск идет в папке с .exe
Это тебе кто сказал? У меня вот EXE создается в подпапке \bin\Debug или \bin\Release, а ищется h-файл относительно той же папке, где лежит исходник, из которого сделан #include...
Цитата
Интересно, где это "где-то там" ?

The #include Directive
А вообще - все implementation defined, зависит от конкретного компилятора и среды разработки.
 К началу страницы 
+ Ответить 
сообщение
Сообщение #12


Новичок
*

Группа: Пользователи
Сообщений: 16
Пол: Мужской
Реальное имя: Сергей

Репутация: -  1  +


Не могу понять зачем нужна переменная level?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #13


Гость






Цитата
зачем нужна переменная level?
А, это чтобы не затормаживать отрисовку сцены. Если будет больше 10 отражений луча - надо прекратить его обработку. В сложных сценах такое очень даже возможно.
 К началу страницы 
+ Ответить 
сообщение
Сообщение #14


Новичок
*

Группа: Пользователи
Сообщений: 16
Пол: Мужской
Реальное имя: Сергей

Репутация: -  1  +


	float temp = n * n;
if (temp == 0.0f) break;

temp = 1.0f / sqrtf(temp);
n = temp * n;

Можно еще объяснить это?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #15


Гость






Это нахождение нормали (направления отраженного луча) в точке пересечения луча со сферой: с учетом того, что нормаль в точке пересечения имеет направление вектора, выпущенного из центра сферы в эту самую точку пересечения, да еще и учитывая нормализацию, вектор N (нормаль) находится вот так:

N = (newStart - sphereCenter) / |newStart - sphereCenter|

Что, собственно, и сделано:
	// чуть выше того, что ты процитировал, находим N = newStart - sphereCenter

float temp = n * n; // temp = квадрат модуля вектора N
if (temp == 0.0f) break; // вектор нулевой, выходим, иначе ниже получим ошибку

temp = 1.0f / sqrtf(temp); // temp = 1 / модуль_вектора
n = temp * n; // нормализуем N
 К началу страницы 
+ Ответить 
сообщение
Сообщение #16


Новичок
*

Группа: Пользователи
Сообщений: 16
Пол: Мужской
Реальное имя: Сергей

Репутация: -  1  +


Пишу трассировку лучей по книге "Программирование компьютерной графики" Ф. Хилла
направление луча задается след. образом:
Код
float x=-W+(float)col*2*W/(float)nCols;
           float y=-H+(float)row*2*H/(float)nRows;
    //вычисляем направление луча
    theRay.setDir(-nearDist*n.x+x*u.x+y*v.x,
            -nearDist*n.y+x*u.y+y*v.y,
            -nearDist*n.z+x*u.z+y*v.z);

вектора n, u, v - поля класса Camera
а камеру задаю:
Код

Point3 eye(0,0,100);
Point3 look(0,0,0);
Vector3 up(0,1,0);
Camera cam;
cam.set(eye,look,up);

может кто задавал параметры для камеры? а то с моими получается, что луч никогда не пересекает даже хотя бы базовую сферу

Прикрепленный файл  Raytracer.v.2.rar ( 3.69 килобайт ) Кол-во скачиваний: 717
(а вот весь код, который у меня есть)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #17


Гость






Цитата
(а вот весь код, который у меня есть)
Оно что у тебя, компилируется? Мне вот чего выдает:

F:\rt\tracer_cpp\glut.h|12|warning: ignoring #pragma warning |
F:\rt\tracer_cpp\hierarchy.h||In member function `void Camera::set(Point3, Point3, Vector3)':|
F:\rt\tracer_cpp\hierarchy.h|354|error: no matching function for call to `Vector3::set(Vector3)'|
F:\tracer_cpp\hierarchy.h|34|note: candidates are: void Vector3::set(float, float, float)|
F:\rt\tracer_cpp\hierarchy.h|36|note: void Vector3::set(Vector3&)|
F:\rt\tracer_cpp\hierarchy.h|38|note: void Vector3::set(Point3&)|
F:\rt\tracer_cpp\hierarchy.h|357|error: no matching function for call to `Vector3::set(Vector3)'|
F:\rt\tracer_cpp\hierarchy.h|34|note: candidates are: void Vector3::set(float, float, float)|
F:\rt\tracer_cpp\hierarchy.h|36|note: void Vector3::set(Vector3&)|
F:\rt\tracer_cpp\hierarchy.h|38|note: void Vector3::set(Point3&)|
F:\rt\tracer_cpp\hierarchy.h||In member function `void Camera::raytrace(Scene&, int)':|
F:\rt\tracer_cpp\hierarchy.h|385|error: no matching function for call to `Color3::set(Color3)'|
F:\rt\tracer_cpp\hierarchy.h|146|note: candidates are: void Color3::set(float, float, float)|
F:\rt\tracer_cpp\hierarchy.h|148|note: void Color3::set(Color3&)|
||=== Build finished: 3 errors, 1 warnings ===|

 К началу страницы 
+ Ответить 
сообщение
Сообщение #18


Гость






Может у кого-то есть книга
"Лорен Хейни. Построение изображений методом слежения луча"?
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 19.04.2024 10:38
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name