Использование конвейера рендеринга обработки 3.0 с пользовательской матрицей проекций

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

Все ближайшие ссылки, которые я обнаружил, несовместимы с opengl. Другим решением, вероятно, было бы разложение этой матрицы для извлечения параметров камеры и установки объекта камеры в каждом кадре. Я не мог заставить это работать. Но мои первые попытки значительно увеличили количество строк.

PMatrix3D p; 

void setup() {
  size(600, 400, P3D);

  p = new PMatrix3D(
    5.400566, 0.519709, -4.3888016, 193.58757, 
    5.284709, -9.016302, 3.312224, 266.927, 
    0.012042404, 7.253584E-5, 0.0084899925, 1.0, 
    0, 0, 0, 1);

  p.invert();
}

void draw() {

  float x = map(mouseX, 0, width, -200, 200);
  float z = map(mouseY, 0, height, -150, 150);


  ((PGraphicsOpenGL) g).camera.set(p);
  //?
  //((PGraphicsOpenGL) g).modelview.set(p);
  //((PGraphicsOpenGL) g).projection.set(p);


  background(20);
  lights();
  translate(width/2, height/2);
  translate(x, 0, z);
  box(100);
}

EDIT Ниже приведен код, в котором я умножаю каждую вершину непосредственно на матрицу. Результаты сильно отличаются от предыдущего кода. Обработка имеет собственный конвейер рендеринга, включая камеру, освещение, шейдеры и т. д. Я не хотел создавать новый шейдер только потому, что не могу установить матрицу камеры. Однако это то, что я делаю сейчас для своего проекта. И тем самым я снижаю частоту кадров наполовину. Ужасно.

PMatrix3D p; 

void setup() {
  size(600, 400, P3D);

  p = new PMatrix3D(
    5.400566, 0.519709, -4.3888016, 193.58757, 
    5.284709, -9.016302, 3.312224, 266.927, 
    0.012042404, 7.253584E-5, 0.0084899925, 1.0, 
    0, 0, 0, 1);

  //p.invert();
}

void draw() {

  float x = map(mouseX, 0, width, -500, 500);
  float z = map(mouseY, 0, height, -500, 500);

  //((PGraphicsOpenGL) g).camera.set(p);
  //((PGraphicsOpenGL) g).modelview.set(p);
  //((PGraphicsOpenGL) g).projection.set(p);

  background(50);
  lights();
  //translate(width/2, height/2);
    translate(x, 0, z);
  stroke(0);
  strokeWeight(1);
  //box(100);
  myBox(true);

}

void myBox(boolean multiplyed) {
  float side = 10;
  float h = side/2;
  /* cube verteces
  -----5------
  --1-------6-
  --------2---
  -----7------
  --3-------8-
  --------4---
  */
  PVector [] vtx = {
    new PVector (-h, -h, -h), 
    new PVector (+h, -h, -h),
    new PVector (-h, +h, -h),
    new PVector (+h, +h, -h),
    new PVector (-h, -h, +h), 
    new PVector (+h, -h, +h),
    new PVector (-h, +h, +h),
    new PVector (+h, +h, +h),
  };

  strokeWeight(5);
  for(PVector v : vtx){
    if(multiplyed){
      PVector result = new PVector();
      PMatrix3D mat = p;
      mat.mult(v, result);
      stroke(#ff0000);
      point(result.x/result.z ,result.y/result.z) ;
    }else{
      point(v.x,v.y,v.z);
    }
  }
}

person Bontempos    schedule 20.09.2016    source источник
comment
Что именно вы имеете в виду, когда говорите, что не можете заставить его работать? Что вы ожидаете от этого кода? Что он делает вместо этого?   -  person Kevin Workman    schedule 21.09.2016
comment
Хорошо, если я возьму каждую вершину из куба (учитывая, что куб — ​​это просто пример гораздо более сложного объекта) и умножу на представленную матрицу, я получу совсем другой результат, чем при использовании кода, который у меня есть до сих пор. Я почти уверен, что просто не могу использовать функцию graphicsOpenGl для настройки матрицы камеры, что и является моей целью.   -  person Bontempos    schedule 23.09.2016


Ответы (1)


Я провел небольшое исследование и выяснил следующее о OpenGL:

«Класс рендерера PGraphicsOpenGL предоставляет функцию, которую можно использовать для этой цели, называемую textureSapling(int mode), где режим может принимать значения 2 (ближайший), 3 (линейный), 4 (билинейный) и 5 ​​(трехлинейный).

Исследование взято с сайта https://github.com/processing/processing/wiki/Advanced-OpenGL под редакцией техносалона.

Поскольку у вас есть только эти параметры, попробуйте изменить переменную mode на более высокое число, чтобы проверить, работает ли это.

person Jordan Green    schedule 08.06.2018