我试图从.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轴上,它完美地工作)。
如果图片有助于了解情况,告诉我,我会上传。
发布于 2016-09-15 20:08:11
所以我终于解决了这个问题。由于缩放方法刚刚更改了矩阵,因此移动对象必须与缩放对象的大小相关。
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);这段代码非常适合我。
https://stackoverflow.com/questions/39377679
复制相似问题