Моя цель состоит только в том, чтобы использовать текущую обработку конвейера рендеринга 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);
}
}
}