我学习OpenGL ES 2.0。但我认为它更多的是C ++问题,而不是OpenGL。我被轮换问题困扰了。众所周知,旋转变换可以使用以下等式来应用:
p'x = cos(theta) * (px-ox) - sin(theta) * (py-oy) + ox
p'y = sin(theta) * (px-ox) + cos(theta) * (py-oy) + oy
但似乎当我多次执行此旋转操作时,会出现精度问题。我想,这个问题的核心是cos函数和浮点限制的不确定结果。结果我看到我的旋转物体变得越来越小。所以:
1。)您如何看待这个问题是否真的与浮点精度问题有关?
2。)如果是这样,我该如何处理呢。
假设float _points []是包含坐标x1,y1,x2,y2 ... xn,yn的数组。然后我按照以下方式在旋转后重新计算我的坐标:
/* For x */
float angle = .... ;
pair<float, float> orig_coordinates(0, 0);
for (; coors_ctr < _n_points * 2; coors_ctr += 2)
_points[coors_ctr] = cos(angle) * (_points[coors_ctr] - _orig_coordinates.first) -
sin(angle) * (_points[coors_ctr + 1] - _orig_coordinates.second) +
_orig_coordinates.first;
/* For y */
coors_ctr = 1;
for (; coors_ctr < _n_points * 2; coors_ctr += 2)
_points[coors_ctr] = sin(angle) * (_points[coors_ctr - 1] - _orig_coordinates.first) +
cos(angle) * (_points[coors_ctr] - _orig_coordinates.second) + _orig_coordinates.second;
答案 0 :(得分:4)
我认为问题在于您将旋转的结果写回输入数组。
p&#39; x = cos(theta)*(px-ox) - sin(theta)*(py-oy)+ ox
p&#39; y = sin(theta)*( p&#39; x -ox)+ cos(theta)*(py-oy)+ oy
尝试进行旋转,或使用临时变量并一次执行一个点(x,y)。