使用 openGL 缩放和移动 3d 对象
Scaling and moving 3d object with openGL
我正在尝试从 .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());
Move 函数和 Scale 函数移动和缩放模型矩阵,而不是实际的坐标数组:
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 轴上它工作得很好)。
如果图片有助于了解情况告诉我,我会上传。
所以我终于解决了这个问题。
由于缩放方法只是改变了矩阵,因此移动对象必须相对于缩放对象的多少。
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);
这段代码非常适合我。
我正在尝试从 .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());
Move 函数和 Scale 函数移动和缩放模型矩阵,而不是实际的坐标数组:
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 轴上它工作得很好)。
如果图片有助于了解情况告诉我,我会上传。
所以我终于解决了这个问题。 由于缩放方法只是改变了矩阵,因此移动对象必须相对于缩放对象的多少。
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);
这段代码非常适合我。