【问题标题】:Scaling and moving 3d object with openGL使用 openGL 缩放和移动 3d 对象
【发布时间】: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


    【解决方案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);
    

    这段代码非常适合我。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-21
      • 2021-10-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-30
      相关资源
      最近更新 更多