Войти
ПрограммированиеФорумФизика

Отражение от поверхности

#0
23:27, 16 ноя. 2007

Задача вот такая: есть направляющий вектор V, поверхность P и ее нормаль N, надо найти вектор X после столкновения с поверхностю P
Короче V ето кабы луч света, а P это зеркало.
VEC | Отражение от поверхности


#1
23:38, 16 ноя. 2007

поворот чтобы ось икс была паралельна Р, игрик движения берется с минусом и обратный поворот

#2
0:46, 17 ноя. 2007

Если вектор V направлен к поверхности, то всё просто:

// если угол брать < 0.5 (берётся в ручную для удобства) то это эквивалентно тому,
// что для отражения вектор должен падать бод углом > 61 градуса,
// посчитать необходимый угол в градусы напимер тот-же 0.5 можно так : RAD2DEG( (pi/2) - angle )
// соответственно обратную формулу легко записать...
static bool MakeReflection( const Vector V, const Vector N, const float &angle, Vector &X )
{
  Vector vecDir = V;
  float magnitude = vecDir.Normalise();

  // Посмотрим надо ли отражать вектор при таком угле
      
  float hitDot = N.Dot( -vecDir ); // DotProduct
      
  if ( hitDot < angle )
  {
    Vector vReflection = 2.0f * N * hitDot + vecDir;
    // Умножим единичный отражённый вектор на длинну предыдущего  
    X = vReflection * magnitude;
    return true;
  }
  return false;
}
#3
1:00, 17 ноя. 2007

Что значит "" float hitDot = N.Dot( -vecDir ); // DotProduct ""
и если можно то немножко теории
ЗЫ я немножко изменил первое сообщение

#4
1:41, 17 ноя. 2007

>Что значит "" float hitDot = N.Dot( -vecDir ); // DotProduct ""
float hiDot = -N.x*vecDir.x - N.y*vecDir.y - N.z*vecDir.z;

#5
3:21, 17 ноя. 2007

MuHAOS

DotProduct - скалярное произведение векторов :)

Соответственно N.Dot( -vecDir );  будет полу отражённым инвертированным углом между нормалью и падающим вектором.

Теория? А какая тут теория...

Почитай про косинус двойного угла,  ибо я уже и сам теорию не помню нифига :D

#6
15:06, 17 ноя. 2007

Блин, зачем так сложно?

Есть вектор vx, vy, vz;
отражается он от поверхности с нормалью nx, ny, nz.

Считаем с начала косинус угла падения, помноженный на 2:
c = 2*(vx*nx + vy*ny + vz*nz);

Теперь результат отражения - вектор Xx, Xy, Xz:
Xx = vx - c*nx,
Xy = vy - c*ny,
Xz = vz - c*nz;

Вот и всё.

#7
15:12, 17 ноя. 2007

Да, а вместо теории лучше просто всё это представить.
Я вот никогда никакой теории не знал, по геометрии были тройки...

Просто представляешь и всё в голове :)

Когда мы считаем косинус угла, то просто проецируем один вектор на другой.
И если учитывать не удвоенный косинус, а просто косинус угла, то полученный вектор Х будет параллелен плоскости отражения.
Этим можно играть и сделать коэффициент отражения (K варьирующийся от 0 до 1).
Тогда не удвоенный косинус будем считать, а некий коэфициент отражения:
c = (1+K)*(vx*nx + vy*ny + vz*nz);

ПрограммированиеФорумФизика

Тема в архиве.