OpenGL Scale Triangle Mesh To Unit Cube - PullRequest
       17

OpenGL Scale Triangle Mesh To Unit Cube

0 голосов
/ 25 ноября 2018

Я пытаюсь загрузить треугольную сетку из файла .off и показать треугольную сетку, центрированную в начале координат и масштабированную, чтобы поместиться в единичный куб.Но по какой-то причине я сильно отклонился, и это выглядит как

enter image description here

То, как я это делаю, - это нахождение экстремумовсетка, и использовать это, чтобы сместить поверхность на эту величину.

float avgX = (maxX + minX) / 2;
float avgY = (maxY + minY) / 2;
float avgZ = (maxZ + minZ) / 2;
Vector3f center(avgX, avgY, avgZ);
Vector3f offset = Vector3f(0, 0, 0) - center;
Translation3f translation(offset);

cout << "offset is: " << endl << offset << endl;

double d_theta = (M_PI / 180);
AngleAxisf rotation(d_theta, Vector3f(0, 0, 1));

float scaleX = (float) 1 / (abs(maxX - minX));
float scaleY = (float) 1 / (abs(maxY - minY));
float scaleZ = (float) 1 / (abs(maxZ - minZ));
AlignedScaling3f scale = AlignedScaling3f(scaleX, scaleY, scaleZ);

Затем я помещаю его в вектор поверхностей с помощью

Vector3f translatedCenter = translation * rotation * scale * center;

VertexBufferObject VBO;
VBO.init();
VBO.update(Vertices);
program.bindVertexAttribArray("position", VBO);

VertexBufferObject VBO_N;
VBO_N.init();
VBO_N.update(FlatNormals);
program.bindVertexAttribArray("normals", VBO_N);

cout << "updated normals" << endl;

VertexBufferObject VBO_C;
VBO_C.init();
VBO_C.update(C);
program.bindVertexAttribArray("color",VBO_C);

cout << "updated color " << endl;

Surface* s = new Surface(VBO, Vertices, translation, rotation, scale, percentScale, translatedCenter, SmoothNormals, FlatNormals, C);

И передаю его в Vertex Shader как «модель»

Affine3f model = s->getTranslation() * s->getRotation() * s->getScale();
glUniformMatrix4fv(program.uniform("model"), 1, GL_FALSE, model.data()); 

Этовсе делается с помощью библиотеки Eigen (https://eigen.tuxfamily.org/dox/group__TutorialGeometry.html#TutorialGeoTransform)

Независимо от того, что я пытаюсь, я немного ошибаюсь. Что я делаю не так?

1 Ответ

0 голосов
/ 25 ноября 2018

Обмен перемещением и вращением:

 Affine3f model = s->getRotation() * s->getTranslation() * s->getScale();

Обратите внимание, что перевод перемещает центр объекта в центр вида.После этого матрица вращения вращается вокруг этого центра.

Если у вас нет проекционной матрицы, то пространство просмотра - это нормализованное пространство устройства, где каждая координата находится в диапазоне [-1, 1].Это означает, что длина стороны составляет 2 = 1 - (-1).Вы должны соблюдать это при расчете шкалы:

float scaleX = (float) 2 / (abs(maxX - minX));
float scaleY = (float) 2 / (abs(maxY - minY));
float scaleZ = (float) 2 / (abs(maxZ - minZ));  
...