нарисовать 3D-сферу в С++ без OpenGL

Мне нужно сделать трассировщик лучей сферы на c/c++ без использования OpenGL. Однако я запутался в том, как поместить сферу или свет в сцену без каких-либо функций gl. Может кто-нибудь объяснить, как это можно сделать?


person linds    schedule 06.11.2012    source источник
comment
Должна ли программа работать в режиме реального времени? Если это так, вы можете использовать SDL или какой-либо другой API, который дает вам доступ к фреймбуферу. Если нет, вы можете вывести файл изображения.   -  person SurvivalMachine    schedule 06.11.2012
comment
Ваш вопрос крайне расплывчатый, отредактируйте свой вопрос, задайте конкретные вопросы и предоставьте нам соответствующие детали вашей ситуации.   -  person Austin Henley    schedule 06.11.2012


Ответы (1)


Трассировка лучей не имеет ничего общего с opengl. Это можно сделать с помощью настольного калькулятора.

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

Вы «помещаете» свою камеру в начало координат: ox=0, oy=0, oz=0.

Вы «помещаете» свою сферу на 5 «метров» или единиц по оси Z: sx=0,sy=0,sz=5;

Вы начинаете отбрасывать лучи под углом 90 градусов к оси Z:

for (i=-1;i<1; i+=0.01) {
   for (j=-1;j<1; j+=0.01) {
       dx=i; dy=j;dz=1;  // perhaps you then need to normalize the "vector" dx,dy,dz
       // check if the ray hits the sphere with radius 2.3 (located at 0,0,5)

       // if it does, calculate the angle of the normal of the hit point and
       // the light source at position lx=1,ly=-0.5;lz=-2.33;

       // if normal dot lightray is positive, calculate angle, apply Phong model

       // add lambertian model, distance attenuation, fog, texturemapping

  }
 }

В конце концов вы рассчитали интенсивность пикселей или значения цвета для изображения размером ~ 200 x 200. В этом примере используется угол обзора 90 градусов.

person Aki Suihkonen    schedule 06.11.2012
comment
HTML5, javascript и 2d-canvas можно использовать для моделирования (почти в реальном времени) математики. Из c/c++ я предлагаю просто выводить в какой-то необработанный формат байт за байтом. Не требуется буфер рендеринга. PPM может быть прочитан irfanview и многими другими приложениями для просмотра изображений. - person Aki Suihkonen; 06.11.2012
comment
Извините, если я совершенно не прав, но несколько уточнений... В вашем примере вектор dx, dy, dz — это луч, исходящий от источника света, верно? А также, чтобы вычислить, попадает ли он в сферу, я бы просто использовал уравнение окружности и сравнил, попал ли луч куда-нибудь в этот набор точек? - person linds; 07.11.2012
comment
В классической трассировке лучей луч (dx,dy,dz) исходит не от источников света, а от глаза. Точки попадания луча в сферу вычисляются путем непосредственного решения уравнения: |t*D - S|^2 = R^2, где есть 0,1 или 2 решения, так как это будет квадратное уравнение. Получите ближайшую букву «т». Это точка входа, если только один не t‹0, а другой t›0, и в этом случае камера находилась внутри сферы. Также из дискриминатора квадратного уравнения сразу видно, сколько есть решений. - person Aki Suihkonen; 07.11.2012