C++ OpenGL使用旋转矩阵时坐标值持续变小、物体收缩问题求助
故障原因与修复方案
核心错误
你计算旋转坐标的逻辑存在时序错误:更新Z分量时,使用的是已经被修改过的新X值,而非旋转前的原始X值,不符合旋转矩阵的计算要求,导致每次调用旋转函数后坐标的模长都会被压缩,最终表现为物体不断收缩。
错误细节
以点a的计算为例:
- 你首先调用
a.setX()修改了a的X属性为旋转后的值 - 后续调用
a.setZ()时,a.getX()返回的是刚更新完成的新X,而非旋转前的原始X,代入计算后的Z分量必然错误,多次叠加后坐标就会不断缩小。
修复方法
每次计算单个点的旋转结果前,先把该点旋转前的X、Z值保存到临时变量中,再用临时变量计算新的坐标值,参考代码如下:
void drehen (float gradY) { // 提前计算三角函数值,避免重复调用浪费性能 float cosVal = cos(gradY); float sinVal = sin(gradY); // 处理点a float oldX = a.getX(); float oldZ = a.getZ(); a.setX(oldX * cosVal + oldZ * sinVal); a.setZ(oldZ * cosVal - oldX * sinVal); // 处理点b oldX = b.getX(); oldZ = b.getZ(); b.setX(oldX * cosVal + oldZ * sinVal); b.setZ(oldZ * cosVal - oldX * sinVal); // 处理点c oldX = c.getX(); oldZ = c.getZ(); c.setX(oldX * cosVal + oldZ * sinVal); c.setZ(oldZ * cosVal - oldX * sinVal); // 处理点s oldX = s.getX(); oldZ = s.getZ(); s.setX(oldX * cosVal + oldZ * sinVal); s.setZ(oldZ * cosVal - oldX * sinVal); std::cout << "x:" << a.getX() << "\tz: " << a.getZ() << "\n"; // 注意:如果init()函数会重置或修改点坐标,请确认调用逻辑是否合理 init(); }
额外注意事项
- C++标准库的
cos、sin函数接收的参数为弧度值,如果你传入的gradY是角度单位,需要先转换为弧度再计算,转换公式为弧度 = 角度 * M_PI / 180.0,该问题不会导致物体收缩,但会导致旋转角度不符合预期。 - 确认
init()函数的逻辑,如果该函数会对点坐标做额外修改,也可能引发其他异常。
内容的提问来源于stack exchange,提问作者Lars Przybylek
相关产品推荐
相关产品推荐

