【问题标题】:Spherical Camera球面相机
【发布时间】:2012-12-12 19:30:25
【问题描述】:

在下面查看我的编辑。

我在原点绘制了一个球体。我的相机正在观察半径为 3 个单位的球体。我正在尝试使用 2D 操纵杆使相机绕球体运行。我目前正在使用下面的代码来环绕球体,但我不确定如何让操纵杆控制操纵杆指向的方向的旋转。我的操纵杆提供 0 度向上的角度,当您逆时针移动时,度数上升到 360。操纵杆离中心起点越远,旋转速度就会增加。我只是不知道该怎么做。

PIOVER180 = Math.PI/180;
rho = 3;
theta = (theta+1)%360;
phi = (theta+1)%360;

camera.position.x = (float) (rho * Math.sin(theta * PIOVER180) * Math.cos(phi * PIOVER180));
camera.position.y = (float) (rho * Math.cos(theta * PIOVER180));
camera.position.z = (float) (rho * Math.sin(theta * PIOVER180) * Math.sin(phi * PIOVER180));
camera.normalizeUp();

libGDX 提供了一个不错的 PerspectiveCamera 类,我希望将其扩展为 SphericalCamera,并在需要时使用它来调用我的轮换。

编辑:

我想如果我能弄清楚如何让 2D 操纵杆正确操纵 thetaphi 变量,那么它应该可以正常工作。 theta 是正 x 轴与球体上的点之间的角度,phi 是该点在 z 轴上的位置(正或负),rho 是到中心点的距离(0, 0, 0) 到球体上的点(基本上是半径)

【问题讨论】:

  • 在场景中使用glRotate(sensitivity,joystickMovementY,joystickMovementX,0.0f)通常比移动相机更好
  • 我正在考虑这样做,但我也会有一堆模型用子弹环绕我的球体。我想改变相机的视角会更容易吗?
  • 这样移动相机没有任何问题。只是你最终会实现一堆数学方法,它们完全可以做 glRotate()glTranslate() 等已经做的事情。
  • 是的,我想我明白你的意思了哈哈...我希望一旦我设置好它,它会很容易。我实际上已经决定走使用四元数进行旋转的路线,此刻我试图将我的头包裹在它们周围。
  • 查看cprogramming.com/tutorial/3d/quaternions.htmlcontent.gpwiki.org/index.php/… 以获取四元数。第二个链接也有代码示例

标签: java android opengl-es libgdx


【解决方案1】:

您正试图以操纵杆控制的方式围绕球体旋转,同时注视中心,对吧?

如果操纵杆给你一个以度为单位的角度“ang”,0 表示向上,那么每个轴的分量将是:

double x = Math.sin(ang*Math.PI/180.);
double y = Math.cos(ang*Math.PI/180.);

然后你可以做的就是将你的相机在它自己的 UP/LEFT 平面上平移这些量,可能使用“速度”参数:

Vector3 left = new Vector3(camera.up).crs(camera.direction).scl((float)(speed*x));
Vector3 up = new Vector3(camera.up).scl((float)(speed*y));
camera.position.add(left).add(up);

此时您的相机将离开所需的轨道,因此您需要将其带回:

camera.position.nor().scl(rho);

在您的代码示例中,您不会在更改位置后更新相机的方向,但根据您的描述这是必要的。查看原点:

camera.direction.set(camera.position).scl(-1).nor();

最后更新上向量和模型矩阵:

camera.normalizeUp();
camera.update(false);

希望这会有所帮助!

【讨论】:

  • 我已经从 libGDX 切换到 Unity3D,但理论实际上是相同的(查看我的 Unity3D 代码后,我的过程与您发布的内容非常相似,只是 API 略有不同)。 .. 我会将其标记为已接受的答案,因为它是正确的,并且适用于 libGDX。欣赏它。
  • 如果我评论camera.direction.set(camera.position).scl(-1).nor(); 行,这个函数允许我移动相机。如何更改与偏移一起使用的功能?问题是它每次都会重置中心的偏移量和球体。
  • 有没有办法将此代码用于环绕球体的物体,而不是相机,并且相机处于固定位置?
猜你喜欢
  • 2018-04-24
  • 2012-11-26
  • 1970-01-01
  • 2021-02-17
  • 1970-01-01
  • 2012-12-11
  • 1970-01-01
  • 1970-01-01
  • 2015-06-22
相关资源
最近更新 更多