【发布时间】:2020-08-12 18:39:46
【问题描述】:
在我的 3D 应用程序中,我有一个 Object3D 类,它在创建时构造为边界框,这个边界框是一个简单的长方体,有一个最小值和一个最大值:
但是,当我翻译我的 Object3D 时,我想使用我的对象的模型矩阵来更新我的边界框:
BoundingBox& TransformBy(const glm::mat4& modelMatrice){
//extract position of my model matrix
glm::vec3 pos( modelMatrice[3] );
//extract scale of my model matrix
glm::vec3 scale( glm::length(glm::vec3(modelMatrice[0])), glm::length(glm::vec3(modelMatrice[1])) , glm::length(glm::vec3(modelMatrice[2])));
//Creating vec4 min/max from vec3
glm::vec4 min_(min.x, min.y, min.z, 1.0f);
glm::vec4 max_(max.x, max.y, max.z, 1.0f);
//Inverting the matrice to multiply my vec4 with it in order to rotate my min max
glm::mat4 inverse = glm::inverse(modelMatrice);
min_ = min_ * inverse;
max_ = max_ * inverse;
//Scale my min_ max_
min_ *= glm::vec4(scale,1.0f);
max_ *= glm::vec4(scale,1.0f);
//adding model matrice translation to min_ and max_
min_ += glm::vec4(pos,0.0f);
max_ += glm::vec4(pos,0.0f);
//Redefining max and min
max = glm::vec3( (min_.x > max_.x)? min_.x:max_.x, (min_.y > max_.y)? min_.y: max_.y, (min_.z > max_.z)? min_.z : max_.z);
min = glm::vec3( (min_.x < max_.x)? min_.x:max_.x, (min_.y < max_.y)? min_.y: max_.y, (min_.z < max_.z)? min_.z : max_.z);
return *this;
}
这就是我如何调用我的 TransformBy 函数:
box.TransformBy(transform.GetModelMatrix());
由于某种原因,它使我的最小和最大点正确旋转,它也翻译它,但我的缩放没有正确应用,使我的边界框比我的 3D 对象具有更大的比例。
为什么我的缩放不能正常工作? 也许有一种不那么复杂的方式来做我想做的事?
【问题讨论】: