【发布时间】:2016-09-07 19:27:39
【问题描述】:
我正在尝试从 .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 轴上它工作得很好)。
如果图片有助于了解情况,请告诉我,我会上传。
【问题讨论】:
标签: c++ opengl graphics 3d opengl-3