我正在做一个项目,我必须展示一些建筑物的 3D 模型,并且用户可以选择其中一个。他们可以自由旋转/移动/缩放 3D 模型,但现在我需要限制它们,这样他们就无法在模型下方看到、缩放太多或将模型从屏幕上移开。当前的代码有点神秘,因为我没有编写它,而且编写它的人并没有真正提供帮助,所以我决定重写它。
这是当前的轮换代码:
void Building3DLayer::rotate(float x, float y)
{
if(!active) return;
kmMat4 copy, rot;
x /= 100.f;
y /= 100.f;
kmMat4Assign(©, &_state.modelview);
kmMat4RotationY(&rot, x);
kmMat4Multiply(&_state.modelview, ©, &rot);
kmMat4Assign(©, &_state.modelview);
_state.rX += y;
kmVec3 axis = {copy.mat[0],copy.mat[4],copy.mat[8]};
kmMat4RotationAxisAngle(&rot, &axis, y);
kmMat4Multiply(&_state.modelview, ©, &rot);
kmMat4Multiply(&_mvp, &_projection, &_state.modelview);
}
我可以用什么来实现这样的目标?我想我可以只使用一个 vec3 作为位置,一个用于旋转,一个浮动作为建筑比例(而不是转换为放大/缩小),但我不知道如何根据缩放来更改限制(如果你靠近它,你可以拖动建筑物比你远离它时所能拖动的更多)。我还阅读了关于轨迹球旋转的文章,它们是否比简单的向量更容易使用(并添加限制)(即使更难编写)?