使用openGL缩放和移动3d对象

时间:2016-09-07 19:27:40

标签: c++ opengl graphics 3d opengl-3

我正在尝试从.obj文件加载3D对象,将其缩放到一定大小以将其移动到某个坐标(我更喜欢更改其矩阵而不是缩放和移动每个向量)。 从.obj解析函数,我知道对象边界框的宽度,高度,深度和中心。

为了说清楚,我有一个从(-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());

其中xn,yn和zn是立方体在每个轴上拉伸的瓦片数量,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;

并转换所有模型:

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

“移动”功能和“缩放”功能可以移动和缩放模型矩阵,而不是真实的坐标数组:

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 个答案:

答案 0 :(得分: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);

这段代码对我来说非常合适。