【问题标题】:Rotating OpenGL scene in 2 axes在 2 个轴上旋转 OpenGL 场景
【发布时间】:2009-12-07 11:00:03
【问题描述】:

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

我想这样做,以便我可以移动 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 度。我只需要让它们彼此独立!

【问题讨论】:

  • 8 月 14 日...您还需要解释吗?

标签: opengl translation rotation dependencies


【解决方案1】:

此代码应该可以帮助您入门:http://www.cse.ohio-state.edu/~crawfis/Graphics/VirtualTrackball.html

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

【讨论】:

    【解决方案2】:

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

    Vector v = new Vector(drawRotateX, drawRotateY, 0);
    float length = v.length();
    v.normalize();
    glRotatef(length, v.x, v.y, v.z);
    

    【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

    • 你是对的,但我的对象不在原点。因此,旋转两次意味着第二次旋转受到第一次的影响。
    • 你好。我认为这无关紧要,只要您在进行翻译之前进行所有旋转即可。也许我误解了你需要什么。我的“高射炮”例子是一个很好的比较吗?还是没有那么多?谢谢!
    • 几个月后我来看看这个,我想到了一个迟到但可能具有建设性的评论:为了正确旋转,确保所有对象都从起源。按照我的描述进行旋转,然后将对象平移到其在世界中的位置。所有这些都是由单个模型视图矩阵完成的,因此它并不比仅进行旋转更昂贵。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-20
    • 1970-01-01
    相关资源
    最近更新 更多