Arcball实现对视图平面的依赖性

时间:2017-03-31 00:46:43

标签: opengl camera opengl-4 rotational-matrices arcball

我有一个完美的工作精细的Arcball实现。通常在opengl中,标准相机面向-Z,意味着XY平面与观察平面平行。

glm::vec3 Arcball::_plane2sphere(glm::vec2 &v)
{
glm::vec2         f = v;
glm::vec3         r;
double            lenSquared;
double            len;

  f         /= _radius;
  lenSquared = f.x * f.x + f.y * f.y;
  len        = sqrt(lenSquared);

  if (lenSquared > 1.0)
  {
    r = glm::vec3(f.x / len,f.y / len, 0.0f );
  }

  else
  { 
    double fz = sqrt(1 - lenSquared);

      r                 = glm::vec3(f.x, f.y, fz);
  }
  return r;
}

现在,如果我将我的相机更改为面向-Y,意味着XZ与观察平面平行,则相同的弧形实现并不适用。我必须按如下方式更改我的arcball实现。 ' Y取代了Z,反之亦然。

glm::vec3 Arcball::_plane2sphere(glm::vec2 &v)
{
glm::vec2         f = v;
glm::vec3         r;
double            lenSquared;
double            len;

  f         /= _radius;
  lenSquared = f.x * f.x + f.y * f.y;
  len        = sqrt(lenSquared);

  if (lenSquared > 1.0)
  {
    r = glm::vec3(f.x / len, 0.0f, f.y / len);
  }

  else
  { 
    double fz = sqrt(1 - lenSquared);

      r                 = glm::vec3(f.x, fz, f.y);
  }
  return r;
}

虽然这对我有意义,但我想知道如果我有一个非常随意的相机怎么办。当我有一个任意相机时,我对象的旋转不直观。

任何帮助表示赞赏! 谢谢!

1 个答案:

答案 0 :(得分:0)

您的arcball代码计算NDC空间,其轴与摄像机空间轴平行。在投影到NDC之前,计算出的旋转可以直接应用于相机空间。

如果要旋转相机,则需要将旋转轴转换为世界空间。

请注意,以上所有内容都适用于相机位置和方向。因此,您的第二个版本是一种在特定相机方向的世界空间中旋转的方法。对于任意相机,请使用从相机到世界的矩阵变换。