OpenGL 旋转 - 局部轴与全局轴

2023-12-08

因此,我尝试根据偏航、俯仰和滚动方案旋转一个对象,相对于该对象自己的局部轴而不是全局空间的轴。根据this,我需要按该顺序执行轮换。我将其解释为:

glRotatef(m_Rotation.y, 0.0, 1.0, 0.0);
glRotatef(m_Rotation.z, 0.0, 0.0, 1.0);
glRotatef(m_Rotation.x, 1.0, 0.0, 0.0);

但是,绕 Y 轴和 Z 轴旋转不起作用。绕 Y 轴的旋转始终相对于全局空间,而绕 z 轴的旋转则与绕 X 轴的旋转为 0 相关,但否则会造成混乱。

为了确定,我也尝试了相反的顺序,但这也不起作用。我想我也尝试了所有其他命令,所以问题一定是其他问题。可能是吗?

这就是我获得旋转的方式:

    ///ROTATIONS
    sf::Vector3<float> Rotation;
    Rotation.x = 0;
    Rotation.y = 0;
    Rotation.z = 0;
    //ROLL
    if (m_pApp->GetInput().IsKeyDown(sf::Key::Up) == true)
    {
        Rotation.x -= TurnSpeed;
    }
    if (m_pApp->GetInput().IsKeyDown(sf::Key::Down) == true)
    {
        Rotation.x += TurnSpeed;
    }
    //YAW
    if (m_pApp->GetInput().IsKeyDown(sf::Key::Left) == true)
    {
        Rotation.y -= TurnSpeed;
    }
    if (m_pApp->GetInput().IsKeyDown(sf::Key::Right) == true)
    {
        Rotation.y += TurnSpeed;
    }
    //PITCH
    if (m_pApp->GetInput().IsKeyDown(sf::Key::Q) == true)
    {
        Rotation.z -= TurnSpeed;
    }
    if (m_pApp->GetInput().IsKeyDown(sf::Key::E) == true)
    {
        Rotation.z += TurnSpeed;
    }

然后将它们添加到 m_Rotation 中,如下所示:

//Rotation
m_Rotation.x += Angle.x;
m_Rotation.y += Angle.y;
m_Rotation.z += Angle.z;

(它们被传递给正在移动的物体内部的函数,但没有对它们进行任何其他操作)。

想法?我还应该调用其他方法来确保所有旋转的轴都是局部轴吗?


Garrick,

当您调用 glRotate(angle, x, y, z) 时,它会围绕您传递给 glRotate 的向量旋转。向量从 (0,0,0) 到 (x,y,z)。

如果要围绕对象的局部轴旋转对象,则需要将对象 glTranslate 到原点,执行旋转,然后将其平移回原来的位置。

这是一个例子:

//Assume your object has the following properties
sf::Vector3<float> m_rotation;
sf::Vector3<float> m_center;

//Here would be the rotate method
public void DrawRotated(sf::Vector<float> degrees) {
  //Store our current matrix 
  glPushMatrix();

  //Everything will happen in the reverse order...
  //Step 3: Translate back to where this object came from
  glTranslatef(m_center.x, m_center.y, m_center.z);

  //Step 2: Rotate this object about it's local axis
  glRotatef(degrees.y, 0, 1.0, 0);
  glRotatef(degrees.z, 0, 0, 1.0);
  glRotatef(degrees.x, 1.0, 0, 0);

  //Step 1: Translate this object to the origin
  glTranslatef(-1*m_center.x, -1*m_center.y, -1*m_center.z);

  //Render this object rotated by degrees
  Render();

  //Pop this matrix so that everything we render after this
  // is not also rotated
  glPopMatrix();
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

OpenGL 旋转 - 局部轴与全局轴 的相关文章

随机推荐

  • 如何使用 python 在 selenium 中加载 chrome 驱动程序中的扩展

    我打开启用了 Browsec 扩展的 Chrome 浏览器的所有努力都失败了 这是我上次尝试过的 Configure the necessary command line option options webdriver ChromeOpt
  • 同一类的多个领域表

    我有一个 RealmObject 类 我想要同一类的多个表 我可以在单个领域 数据库 中执行此操作吗 或者我需要有多个领域 每个领域一个表 如果必须是多个Realm Realm切换过程有多快 我想要同一类的多个表 那么你有两个合理的选择 1
  • JavaScript 在 JSON 对象中递归搜索

    我正在尝试返回 JSON 对象结构中的特定节点 如下所示 id 0 children id 1 children id 2 children 所以这是一个树状的子父关系 每一个node有一个唯一的ID 我正在尝试寻找一个具体的node像这样
  • 查找总和为给定数字的所有可能子集

    我正在学习Python 但我有一个问题 这似乎是一个简单的任务 我想找到总和为给定数字的所有可能的数字组合 例如 4 gt 1 1 1 1 1 1 2 2 2 1 3 我选择生成所有可能的子集 2 n 的解决方案 然后仅生成总和等于数字的子
  • 如何在 Chrome 扩展中的后台脚本之间传递变量值

    我正在开发一个谷歌浏览器扩展 我在我的后台 javascript 文件 example js 之一中为变量设置了一个值 我需要访问该值或将其传递给另一个后台 javascript 文件 extjs js 我该怎么做 有全局变量的概念吗 我的
  • 用于从特定单元格中删除复选框的宏

    我将复选框拉入电子表格 用于选择某些行项目以获得最终成本 不过 还是有一些不需要的复选框被拉入 总共大概有 5 个左右 我可以使用宏来访问这些不需要的复选框的特定单元格 由于我的数据发生变化 这些不需要的复选框并不总是位于同一个位置 因此我
  • 更改(自定义)进度条颜色

    我正在创建一个带有属性的自定义进度条 Public Class CustomProgressBar Inherits ProgressBar Private State As ProgressStates
  • 是什么让 new Date() / 1000 成为有效的 JavaScript?

    我为什么可以用数字 除 一个对象 更新较晚鉴于我的回答包含一些不完整的内容 有时甚至是彻底的内容wrong信息 我认为最好纠正我的错误 虽然晚了 但还是要说 几乎所有的 JS 对象都有 23方法的共同点 valueOf 对于日期对象 它映射
  • 即使出现错误,如何强制创建存储过程?

    当我执行数据库脚本时 我在存储过程中遇到错误 然后它无法创建有错误的存储过程 我想强制创建存储过程 即使存储过程中出现一些错误 如果创建过程语句中发生一些错误 则不会创建存储过程 我想要的是 无论是否发生错误 存储过程都会被创建 实际上我们
  • WPF TreeViewItem 切换按钮可见性

    我遇到了一个问题 希望有人能帮我解决 我遇到过这样的情况 我的节点包含一组可见性设置为 false 的子节点 我希望如果 TreeViewItem 的所有子项都是不可见的 我可以禁用 TreeViewItem 旁边的切换箭头 这可能吗 这是
  • 如何对 Flash 对象使用 display none 和 block?

    我已经嵌入了一些 Flash 如下所示 div style display none div
  • SQL Server 锁定的 DataReader 行为

    当通过 SQL Server 查询返回大型数据集时 我们的数据层会遇到一些问题DataReader 当我们使用DataReader要填充业务对象并将它们序列化回客户端 获取可能需要几分钟 我们正在向用户显示进度 但我们发现受影响的表上正在进
  • JavaScript 是否有集合数据结构的实现?

    我正在寻找 JavaScript 中集合数据结构的合适实现 它应该能够支持纯 JavaScript 对象的元素 到目前为止我只发现闭包库的structs Set 但我不喜欢它修改我的数据 ECMAScript 6 有它 Spec http
  • 序列化和反序列化期间如何调用构造函数?

    序列化和反序列化过程中如何调用构造函数 什么时候有一个类实现可序列化 当存在父 子关系并且只有子实现可序列化时 当存在父子关系并且父子都实现了可序列化时 在反序列化期间 为继承层次结构中未实现 Serialized 的第一个类调用可访问的默
  • 如何编写迁移以使用ManyToManyField更改模型的主键

    我有一个UserProfile指的是我的模型User模型与一个OneToOneField 我也用post save信号自动创建UserProfile当用户被创建时 除了通过管理员创建用户 我使用内联 时 当我收到有关重复配置文件的错误时 这
  • 有没有办法在不调用另一个函数的情况下从成功处理程序中获取值?

    好的 现在我正在这样做 google script run withSuccessHandler updateOutput withFailureHandler errorOutput finish 进而 function updateOu
  • 50 次迭代后,常数“pi”的近似值并没有变得更好

    在 R 中我写了这个函数 ifun lt function m o c for k in 1 m o k prod 1 k prod 2 1 k 1 o sum 2 1 sum o Final result print o sum 该函数近
  • Android Room:使用 Room 插入关系实体

    我在 Room 中添加了一对多关系Relation 我提到这个帖子在 Room 中为关系编写以下代码 这篇文章讲述了如何从数据库读取值 但将实体存储到数据库中会导致userId为空意味着这两个表之间没有关系 我不确定什么是理想的方式inse
  • 管理员访问白名单IP地址

    我的网站上有一个区域 我只想允许少数人访问 我的代码现在仅适用于一个 IP 地址 但我希望能够添加更多 这是我正在使用的 ipaddress SERVER REMOTE ADDR if ipaddress 111 111 111 111 A
  • OpenGL 旋转 - 局部轴与全局轴

    因此 我尝试根据偏航 俯仰和滚动方案旋转一个对象 相对于该对象自己的局部轴而不是全局空间的轴 根据this 我需要按该顺序执行轮换 我将其解释为 glRotatef m Rotation y 0 0 1 0 0 0 glRotatef m