首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用openGL缩放和移动三维物体

用openGL缩放和移动三维物体
EN

Stack Overflow用户
提问于 2016-09-07 19:27:39
回答 1查看 2.7K关注 0票数 1

我试图从.obj文件中加载一个3D对象,将其缩放到一定的大小,以将其移动到某个坐标(与缩放和移动每个矢量相比,我更喜欢更改其矩阵)。通过.obj解析函数,我知道对象的边框的宽度、高度、深度和中心。

为了说明这一点,我有一个从(-1.0,0,1.0)到(1.0,0,-1.0)的瓷砖映射,为了建模所有的东西,我使用了一个多维数据集的obj文件(长度为40.0)。很明显,我必须在打印之前对立方体进行缩放。

我的问题是,我在z轴上正确地移动立方体时一直失败。缩放是这样做的:

代码语言:javascript
复制
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):

代码语言:javascript
复制
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;

并将所有模型转换为:

代码语言:javascript
复制
model.Move(x_trans - model.GetX(), y_trans - model.GetY(), z_trans - model.GetZ());

移动函数和缩放函数移动和缩放模型矩阵,而不是真正的坐标数组:

代码语言:javascript
复制
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轴上,它完美地工作)。

如果图片有助于了解情况,告诉我,我会上传。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-09-15 20:08:11

所以我终于解决了这个问题。由于缩放方法刚刚更改了矩阵,因此移动对象必须与缩放对象的大小相关。

代码语言:javascript
复制
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);

这段代码非常适合我。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39377679

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档