2016-09-07 8 views
2

Я пытаюсь загрузить 3D-объект из файла .obj, чтобы масштабировать его до определенного размера, чтобы переместить его на определенную координату (я предпочитаю изменять его матрицу, чем масштабирование и перемещение каждый вектор). Из функции разбора .obj я знаю ширину, высоту, глубину и центр ограничивающего прямоугольника объекта.Масштабирование и перемещение 3d-объекта с openGL

Чтобы сделать это ясно, у меня есть карта плиток с (-1,0, 0, 1,0) до (1,0, 0, -1,0) и для моделирования всего, что я использую obj-файл куба (с длиной 40,0). Ясно, что перед печатью мне пришлось масштабировать куб.

Моя проблема заключается в том, что я продолжаю отказываться от правильного перемещения куба на оси z. Масштабирование было сделано таким образом:

model.Scale(xn * x_unit/model.GetWidth(), yn * y_unit/model.GetHeight(), zn * z_unit/model.GetDepth()); 

где х, уп и гп являются количество плиток куб будет растягиваться на каждой оси и x_unit, y_unit и z_unit являются длина каждой плитки в этой оси (это функция работает отлично)

для того, чтобы переместить куб до нужного места, я вычислил сумму перевода в каждой оси (предполагается, что центр куба находится на 0, 0, 0):

x_trans = (((xn - (2.0f/x_unit))/2.0f) * model.GetOriginalWidth())/xn; 
y_trans = (0.5f * model.GetOriginalHeight()); 
z_trans = ((zn - (2.0f/z_unit))/2.0f) * model.GetOriginalDepth()/zn; 

И transalting все модель:

model.Move(x_trans - model.GetX(), y_trans - model.GetY(), z_trans - model.GetZ()); 

Функция Move и функция перемещает Масштаб и масштабирует матрицу модели, а не реальный массив координат:

void Graphic3dModelPart::Move(float dx, float dy, float dz) 
{ 
    model_ = glm::translate(model_, glm::vec3(dx, dy, dz)); 
    mvp_ = projection_ * view_ * model_; 
} 

void Graphic3dModelPart::Scale(float sx, float sy, float sz) 
{ 
    model_ *= glm::scale(glm::mat4(), glm::vec3(sx, sy, sz)); 
    mvp_ = projection_ * view_ * model_; 
} 

Однако проблема заключается в том, что по оси Z что-то пойдет не так (когда куба глубина более одной длины плитки (по оси x и оси y она отлично работает).

Если фотографии помогут понять ситуацию, скажите мне, и я загружу.

ответ

1

Итак, я, наконец, решил проблему. Поскольку метод масштабирования просто изменил матрицу, перемещение объекта должно быть относительно того, насколько вы масштабировали объект.

float x_trans, y_trans, z_trans; 

model.Scale(xn * x_unit/model.GetWidth(), yn * y_unit/model.GetHeight(), zn * z_unit/model.GetDepth()); 
model.Move(0.0f - model.GetX()/(xn * x_unit/model.GetOriginalWidth()), 0.0f - model.GetY()/(yn * y_unit/model.GetOriginalHeight()), 0.0f - model.GetZ()/(zn * z_unit/model.GetOriginalDepth())); 

x_trans = (((xn - (2.0f/x_unit))/2.0f + x_offset) * model.GetOriginalWidth())/xn; 
y_trans = ((yn/2.0f + y_offset) * model.GetOriginalHeight())/yn; 
z_trans = (((zn - (2.0f/z_unit))/2.0f + z_offset) * model.GetOriginalDepth())/zn; 

model.Move(x_trans, y_trans, z_trans); 

Этот код просто отлично работает для меня.