4

我有一个场景,其中包含位于空间中任何位置的对象,我正在制作一个类似轨迹球的界面。

我想这样做,以便我可以移动 2 个单独的滑块以分别在 x 和 y 轴上旋转它:

glRotatef(drawRotateY,0.0,1.0f,0);
glRotatef(drawRotateX,1.0f,0.0,0.0);
//draw stuff in space

但是,上面的代码不起作用,因为 X 旋转将依赖于 Y 旋转。

我怎样才能在不使用 gluLookAt() 的情况下实现这一点?

编辑:我想说我的实现比轨迹球接口更简单。基本上,如果 x 滑块值为 80,y 滑块值为 60,则垂直旋转 80 度,水平旋转 60 度。我只需要让它们彼此独立!

4

3 回答 3

0

这段代码应该让你开始:http ://www.cse.ohio-state.edu/~crawfis/Graphics/VirtualTrackball.html

它解释了如何使用 GL 窗口中的当前鼠标位置来实现虚拟轨迹球。

于 2009-08-14T15:24:31.973 回答
0

你可能会使用这样的东西:

Vector v = new Vector(drawRotateX, drawRotateY, 0);
float length = v.length();
v.normalize();
glRotatef(length, v.x, v.y, v.z);
于 2009-08-14T15:34:18.430 回答
0

当您说垂直和水平旋转时,您的意思是像高射炮一样 - 围绕垂直 Z 轴旋转,面对特定的罗盘航向(偏航),然后旋转到特定的高度(俯仰)?

如果是这种情况,那么您只需要按照正确的顺序进行两次旋转,一切都会好起来的。在此示例中,您必须先进行“俯仰”旋转,然后进行“偏航”旋转。一切都会好起来的。

如果您指的是更复杂的东西(例如 Elite 中的“Cobra”宇宙飞船),那么您将需要一个更复杂的解决方案。

于 2009-08-25T10:50:02.243 回答