在两个轴上旋转OpenGL场景

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度。我只需要使它们彼此独立!

1
8月14日...您还需要解释吗? - Thorsten S.
3个回答

0
你可以使用类似这样的代码:
Vector v = new Vector(drawRotateX, drawRotateY, 0);
float length = v.length();
v.normalize();
glRotatef(length, v.x, v.y, v.z);

在这里找到了一个 Vec3f 的实现:http://wwwx.cs.unc.edu/~lastra/Courses/COMP238_F2000/Code/vec3f.hpp不过,它并没有起作用。 - KeniF

0

0

当你说垂直和水平旋转时,是指像高射炮一样绕着垂直的Z轴旋转,面对特定罗盘方向(偏航)并旋转到特定仰角(俯仰)吗?

如果是这种情况,那么您只需要按正确顺序进行两次旋转,一切都会很好。在这个例子中,您必须首先执行“俯仰”旋转,然后才能执行“偏航”旋转。一切都会运作良好。

如果您指的是更复杂的事情(例如Elite中的“Cobra”宇宙飞船),那么您将需要更加琐碎的解决方案。


你是对的,但我的物体不在原点。因此,旋转两次意味着第二次旋转受第一次旋转的影响。 - KeniF
嗨。我认为这不应该有影响,只要你在进行平移之前完成所有旋转。也许我误解了你的需求。我的“高射炮”例子是一个好的比较吗?还是不太合适?谢谢! - Jonathan Hartley
现在我回头看这个,几个月后,我想到了一个可能有建设性的评论:为了正确旋转,通常要确保所有对象都从原点开始。按照我描述的方式进行旋转,然后将对象转换到其在世界中的位置。所有这些都由单个模型视图矩阵完成,因此它不比仅进行旋转更昂贵。 - Jonathan Hartley

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接