Масштабирование и перевод матрицы - PullRequest
0 голосов
/ 27 декабря 2018

Я использую отложенное освещение, используя точечные источники света.Мой подход к визуализации источников света следующий:

 Take an Unit Sphere[S]
 Center=(0,0,0)
 Radius=1 unit

Я выполняю рендеринг по 4 точечным источникам света с различным расположением и объемом влияния

Point Light 1
Position[P]==(-5f,0.4f,-6f)
Radius_Of_Influence[R]=1.5f

Point Light 2
Position[P]==(5f,0.4f,-6f)
Radius_Of_Influence[R]=2.5f

Point Light 3
Position[P]==(-5f,0.4f,6f)
Radius_Of_Influence[R]=0.8f

Point Light 4
Position[P]==(-5f,0.4f,6f)
Radius_Of_Influence[R]=0.7f

Теперь у меня есть один объект Matrix4f идля каждого источника света

for(PointLight light:lights)
{
 translate(light.position(),modelMatrix);/*Translate the matrix with position*/
 scale(light.radius(),modelMatrix);/*Scale the matrix with radius of influence*/
 render_sphere();
} 

Вот метод перевода матрицы

public void translate(float x,float y,float z)
  {
    translation.negate(); /*Undo the previous translation*/
    Matrix4f.translate(translation.toVector(temp),modelMatrix,modelMatrix);

    translation.set(x,y,z);/*translate with new values*/
    Matrix4f.translate(translation.toVector(temp),modelMatrix,modelMatrix);
  } 

А вот метод масштабирования матрицы

 public void scale(float x,float y,float z)
  { 
   scale.set(1/scale.x,1/scale.y,1/scale.z);/*undo previous scaling*/
   Matrix4f.scale(scale,modelMatrix,modelMatrix);

   scale.set(x,y,z);/*apply new scale*/
   Matrix4f.scale(scale,modelMatrix,modelMatrix);
}

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

Вот матрица модели для каждого источника света в каждом кадре

    2.899367 0.0 0.0 -5.0
    0.0 2.899367 0.0 0.4
    0.0 0.0 2.899367 -6.0
    0.0 0.0 0.0 1.0

    2.899367 0.0 0.0 23.993671
    0.0 2.899367 0.0 0.39999998
    0.0 0.0 2.899367 -6.0
    0.0 0.0 0.0 1.0

    3.6717935 0.0 0.0 -5.0
    0.0 3.6717935 0.0 0.39999998
    0.0 0.0 3.6717935 22.993671
    0.0 0.0 0.0 1.0

    4.380832 0.0 0.0 31.717934
    0.0 4.380832 0.0 0.39999998
    0.0 0.0 4.380832 22.993671
    0.0 0.0 0.0 1.0

    2.899367 0.0 0.0 -12.090389
    0.0 2.899367 0.0 0.39999998
    0.0 0.0 2.899367 -20.81465
    0.0 0.0 0.0 1.0

4.380832 0.0 0.0 -1549.4392
0.0 4.380832 0.0 0.39999998
0.0 0.0 4.380832 -3280.6797
0.0 0.0 0.0 1.0

2.899367 0.0 0.0 -1593.2476
0.0 2.899367 0.0 0.39999998
0.0 0.0 2.899367 -3324.488
0.0 0.0 0.0 1.0

2.899367 0.0 0.0 -1564.2539
0.0 2.899367 0.0 0.39999998
0.0 0.0 2.899367 -3324.488
0.0 0.0 0.0 1.0

3.6717935 0.0 0.0 -1593.2476
0.0 3.6717935 0.0 0.39999998
0.0 0.0 3.6717935 -3295.4944
0.0 0.0 0.0 1.0

4.380832 0.0 0.0 -1556.5295
0.0 4.380832 0.0 0.39999998
0.0 0.0 4.380832 -3295.4944
0.0 0.0 0.0 1.0

2.899367 0.0 0.0 -1600.3379
0.0 2.899367 0.0 0.39999998
0.0 0.0 2.899367 -3339.3027
0.0 0.0 0.0 1.0

Самый правый столбецявляется вектором перевода, и его значения быстро меняются.

Если я использую отдельные матрицы моделей для каждого источника света, он работает нормально, но я хочу сохранить память и выполнять операции только с одним объектом Matrix.

Идея состоит в том, чтобы отменить перевод и масштабирование из предыдущих кадров и применить новое преобразование

Любые идеи о том, как это сделать нане матрица?Вращение также должно быть сохранено

...