我有一个包含位于太空任何地方的物体的场景,我正在制作一个类似轨迹球的界面。
我想制作它以便我可以移动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度。我只需要让它们彼此独立!
答案 0 :(得分:0)
此代码可以帮助您入门:http://www.cse.ohio-state.edu/~crawfis/Graphics/VirtualTrackball.html
它解释了如何使用GL窗口中的当前鼠标位置实现虚拟轨迹球。
答案 1 :(得分:0)
你可以使用这样的东西:
Vector v = new Vector(drawRotateX, drawRotateY, 0);
float length = v.length();
v.normalize();
glRotatef(length, v.x, v.y, v.z);
答案 2 :(得分:0)
当你说垂直和水平旋转时,你的意思是像一架高射炮 - 围绕垂直Z轴旋转,面向特定的罗盘航向(偏航),然后旋转到特定的高度(俯仰)? / p>
如果是这种情况,那么你只需按正确的顺序进行两次旋转,一切都会顺利进行。在此示例中,您必须首先执行“俯仰”旋转,然后执行“偏航”旋转。一切都会好起来的。
如果你的意思更复杂(例如像精英中的'Cobra'宇宙飞船)那么你将需要一个更加繁琐的解决方案。