【问题标题】:Arcball Implementation Dependency on View Plane视图平面上的 Arcball 实现依赖关系
【发布时间】:2017-08-25 03:10:16
【问题描述】:

我有一个运行良好的 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 平行于观察平面,相同的轨迹球实现并不适用。我不得不改变我的轨迹球实现如下。 '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;
}

虽然这对我来说确实有意义,但我想知道如果我有一个非常随意的相机会怎样。当我有一个任意相机时,我的对象的旋转是不直观的。

感谢任何帮助! 谢谢!

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

    • 这是我想做的事情。我在 myscene 中有一个相机和一个物体。在鼠标单击拖动时,我希望相机在它现在所做的场景中移动。在 Shift + 鼠标拖动时,我希望对象旋转。我正在从轨迹球中计算一个四元数并将其与相机矩阵相乘。当我不更换相机而只是移动拖动并旋转对象时,它可以正常工作。但是当我将凸轮拖动并移动到任意位置时,在移位拖动时,对象仍然旋转,但它不跟随我的鼠标并且不直观。我正在尝试使用任意相机对我的对象进行直观的旋转。
    • 但我将从四元数(但我基于 Shift/No Shift 填充到不同的变量)中获得的相同旋转矩阵应用于对象和相机,我猜那不是方法来做到这一点。那么当相机空间轴不平行于 NDC 空间时,如何校正对象的旋转。我的意思是我需要在对象转换上添加什么转换,以便它像现在当凸轮空间与 NDC 平行时一样跟随我的鼠标。
    • 要走的路是同时使用以前的 quaternium 和新的轮换。按正确的顺序组合它们。
    猜你喜欢
    • 2010-12-02
    • 2011-04-15
    • 1970-01-01
    • 1970-01-01
    • 2015-12-28
    • 2016-06-12
    • 2019-03-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多