Scaling and moving 3d object with openGL
我正在尝试从.obj文件加载3D对象,以将其缩放到一定大小以将其移动到某个坐标(我更喜欢更改其矩阵,而不是缩放和移动每个矢量)。
从.obj解析函数中,我知道对象边界框的宽度,高度,深度和中心。
为了清楚起见,我有一个从(-1.0,0,1.0)到(1.0,0,-1.0)的图块映射,为了对所有内容进行建模,我使用了多维数据集的obj文件(长度为40.0)。显然,在打印之前,我必须先缩放多维数据集。
我的问题是我一直无法在z轴上正确移动多维数据集。
缩放是通过以下方式完成的:
1 | 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):
1 2 3 | 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; |
并转换所有模型:
1 | model.Move(x_trans - model.GetX(), y_trans - model.GetY(), z_trans - model.GetZ()); |
Move函数和Scale函数移动并缩放模型矩阵,而不是实际的坐标数组:
1 2 3 4 5 6 7 8 9 10 11 | 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 2 3 4 5 6 7 8 9 10 | 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); |
这段代码对我来说是完美的。