Трассировка лучей - Отражение

Сейчас я работаю над трассировщиком лучей, частью отражения. У меня все работает правильно, включая создание сферы с тенью. Теперь я реализую часть отражения. Однако я не мог этого понять. Мой алгоритм ниже:

traceRay(Ray ray, int counter){
// look through the intersection between ray and list of objects
// find the final index aka the winning index, (if final index == -1, return background color)
// then calculate the intersection point

// perform reflection calculation here
if(counter > 1  && winning object's reflectivity > 1 ){
  //get the intersection normal, vector N
  //Calculate the reflection ray, R
  // let I is the inverse of direction of incoming ray
  //Calculate R = 2aN - I (a = N dotProduct I)

  // the reflection ray is origin at the point of intersection between incoming ray and sphere with the R direction
  Ray reflecRay (intersection_poisition, R);

  Color reflection = traceRay(reflecRay, counter + 1);
  // multiply by fraction ks
  reflection = reflection * ks;
}


// the color of the sphere calculated using phong formula in shadeRay function
Color prefinal = shadeRay();


// return the total color of prefinal + reflection

}

Я пытаюсь получить отражение, но не могу его получить, может ли кто-нибудь сообщить мне, верен ли мой алгоритм для функции traceRay?


person user3382260    schedule 05.03.2014    source источник
comment
Вы обрисовали в общих чертах, что должен делать ваш код, но мы понятия не имеем, что он делает на самом деле.   -  person n. 1.8e9-where's-my-share m.    schedule 05.03.2014
comment
как вы рассчитываете свой отраженный вектор? Кроме того, убедитесь, что вы смещаете его относительно объекта, с которым первоначально сталкиваетесь, чтобы предотвратить самопересечение (обычно вы смещаете его вдоль отраженного вектора или нормали к поверхности).   -  person Necrolis    schedule 05.03.2014
comment
Распечатка исходных данных о лучах и результатов промежуточных расчетов может оказаться в некоторой степени полезной.   -  person n. 1.8e9-where's-my-share m.    schedule 05.03.2014
comment
Направление отраженного вектора вычисляется по формуле: 2aN - I, где N - вектор нормали к сфере и точке пересечения. a - это N точечное произведение I, а I - направление, обратное направлению входящего луча.   -  person user3382260    schedule 05.03.2014
comment
У меня нет времени проверить, алгебраически ли это эквивалентно следующему: math.stackexchange.com/questions/13261/, но я подозреваю, что вы случайно изменили направление луча.   -  person Necrolis    schedule 05.03.2014
comment
Спасибо за ссылку. Я проверил. Это то же самое, что и я. Фактически, формула дана моим профессором, так что я почти уверен, что это правильно.   -  person user3382260    schedule 05.03.2014


Ответы (1)


При отражении луча нужно перемещать его по нормали к отражателю, чтобы избежать пересечения с самим отражателем. Например:

 const double ERR = 1e-12;
 Ray reflecRay (intersection_poisition + normal*ERR, R);
person concept3d    schedule 05.03.2014