首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >视图平面上的Arcball实现依赖关系

视图平面上的Arcball实现依赖关系
EN

Stack Overflow用户
提问于 2017-03-31 08:46:43
回答 1查看 236关注 0票数 0

我有一个完美的工作良好的Arcball实现。通常在opengl中,标准相机面向-Z,这意味着XY平面与视图平面平行。

代码语言:javascript
复制
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实现就不好用了。我必须更改我的arcball实现,如下所示。‘Y’代替‘Z’,反之亦然。

代码语言:javascript
复制
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;
}

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

如有任何帮助,我们不胜感激!谢谢!

EN

回答 1

Stack Overflow用户

发布于 2017-03-31 23:20:44

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

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43130629

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档