首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >OpenGL旋转-局部轴与全局轴

OpenGL旋转-局部轴与全局轴
EN

Stack Overflow用户
提问于 2012-03-14 13:24:29
回答 2查看 9.9K关注 0票数 3

所以我得到了一个物体,我试图根据偏航,俯仰和滚动方案旋转,相对于物体自己的局部轴,而不是全局空间的轴。根据this的说法,我需要按该顺序执行旋转。我将其解释为:

代码语言:javascript
运行
AI代码解释
复制
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,否则会造成混乱。

为了确认,我也尝试了相反的顺序,但这也不起作用。我想我也试过了所有其他的订单,所以问题一定是别的什么。可能是这样吗?

这是我获得旋转的方法:

代码语言:javascript
运行
AI代码解释
复制
    ///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中:

代码语言:javascript
运行
AI代码解释
复制
//Rotation
m_Rotation.x += Angle.x;
m_Rotation.y += Angle.y;
m_Rotation.z += Angle.z;

(它们被传递给正在移动的对象内部的一个函数,但没有对它们做任何其他事情)。

有什么想法?还有什么是我应该调用的,以确保所有被旋转的轴都是局部轴?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-03-18 18:56:09

加里克

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

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

下面是一个示例:

代码语言:javascript
运行
AI代码解释
复制
//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();
}
票数 1
EN

Stack Overflow用户

发布于 2013-01-06 16:49:41

您的问题是,您正在存储您的x,y,z旋转,并累加到它们。然后,当您渲染时,您将在单位矩阵上执行总累积旋转(您将全局执行所有旋转)。从你的渲染循环中注释掉你的标识调用。并确保在初始化函数中设置了标识。然后

代码语言:javascript
运行
AI代码解释
复制
rotate as normal
m_Rotation.x = m_Rotation.y = m_Rotation.z = 0.0f; 
//clear your rotations you don't want them to accumulate between frames
glpush
translate as normal
(all other stuff)
glpop
//you should be back to just the rotations 
//glclear and start next frame as usual

我相信你在接受了原始答案之后就发现了这一点。旋转或平移的顺序不会影响旋转发生在哪个轴上,而是影响执行旋转的点。例如,将一颗行星旋转15度会使其在全球轴上旋转15度。将其从原点平移,然后旋转将导致它在平移的距离处环绕原点(如果在与旋转相同的轴上,则在x轴上平移,然后在y轴上旋转将不会有任何混淆效果)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9702867

复制
相关文章
Python 嵌套列表展开
问题1:对于列表形如 list_1 = [[1, 2], [3, 4, 5], [6, 7], [8], [9]] 转化成列表 list_2 = [1, 2, 3, 4, 5, 6, 7, 8, 9] 的问题。
py3study
2020/01/08
3K0
AngularDart Material Design 列表 顶
它构成了选择和菜单组件的基础。 MaterialListComponent类充当提供样式和收集项事件的能力的列表的根节点。
南郭先生
2018/09/30
6890
python进阶-嵌套列表展开
本文讲解的是一个Python的进阶知识点:**如何将一个嵌套的大列表展开形成一个大列表。
皮大大
2023/08/25
4170
python进阶-嵌套列表展开
AngularDart Material Design 下拉列表 顶
material-dropdown-select组件结合了material-select和material-button-down的API。
南郭先生
2018/09/30
5.2K0
JSX onClick 和 HTML onclick 的区别
在 JSX 中可以通过 onClick 这样的方式给一个元素添加一个事件处理函数,当然,在 HTML 中也可以用 onclick (小写 c),但在 HTML 中直接书写 onclick 一直就是为人垢病的写法,网页应用开发界一直倡导的是用 jQuery 的方法添加事件处理函数,直接写 onclick 会带来代码混乱的问题。
Leophen
2021/07/08
1.8K0
Material Design — 网格列表(Grid lists)
自上次参加完回音分享会后,我下定决心要洗心革面乖乖打基础,于是开启了这个part,争取两个月不间断更新,写完Material Design与iOS中的组件(顺便学学英语),以便今后在使用的时候完全不虚
霖酱
2018/05/17
3.6K0
[iOS] 列表滑动展开隐藏头部HeaderView
首先看一下BiliBili客户端的视频浏览界面。默认界面Header完全展开,并且Header显示AV号(别乱想,就是视频编号了)以及播放按钮。滑动之后Header被压缩,按钮移到AV号左边。
wOw
2018/09/18
3.5K0
[iOS] 列表滑动展开隐藏头部HeaderView
关于安卓开发实现可展开的列表组件
三个布局文件 main.xml      childs.xml      groups.xml 一个java文件  List_lianxi.java main.xml文件代码 1 <?xml ver
听着music睡
2018/05/18
1.1K0
javascript中onclick(this)用法和onclick(this.value)用法介绍
2.onclick(this)代码详解 一般标签中会使用href和onclick两种方式来进行进行页面跳转或执行动作,但是小编一般都会使用onclick来进行执行Ajax函数进行跳转,并同时使用οnclick=”xxxxxx(this)”来传递动态参数:例子如下
全栈程序员站长
2022/07/08
1.9K0
用于查找子列表总和的 Python 程序
以下程序返回子列表的总和,即使用 for 循环返回给定开始和结束索引的元素总和 −
很酷的站长
2023/02/23
1.9K0
用于查找子列表总和的 Python 程序
用于列表下拉加载loading动画
一、效果图 弹跳加载 二、实现代码 <view class="bouncing-loader"> <view></view> <view></view> <view></view> </v
_kyle
2020/08/24
3.7K0
用于列表下拉加载loading动画
react onclick传递参数
onClick={this.Mallclose.bind(this,e,index)}
windseek
2019/01/02
2.9K0
emlog文章调用列表+今日更新红色标题+置顶单独代码
<?php //自己写的最新文章调用函数 date_default_timezone_set('Asia/Shanghai'); function aizhanyunblog_new($num){
用户8099761
2023/05/11
2180
Typecho无插件单独调用某个分类最新文章列表方法
昨天,老蒋在设置企业网站调用随机文章的时候可以随机出现已有的内容,但是有的公司企业网站是有人维护更新的,这里只可以用直接在首页某个位置调用某个更新分类的文章。这就没有必要用随机假装样子有在更新的了,人家是真的在更新文章。
老蒋
2021/12/24
8060
onclick与addEventListener区别
这次做项目遇到了这个问题,本来习惯性的每次都写的是addEventListener绑定click事件。但是当用addEventListener绑定了多次click事件的时候,引发了我的思考,这两者有区别吗?具体的事件分析可查看另一篇文章
全栈程序员站长
2022/09/14
1.6K0
jsp button onclick事件汇总
<input onclick="document.all.WebBrowser.ExecWB(1,1)" type="button" value="打开" name="Button1"> <input onclick="document.all.WebBrowser.ExecWB(4,1)" type="button" value="另存为" name="Button2"> <input onclick="document.all.WebBrowser.ExecWB(10,1)" type="button"
week
2018/08/27
2.3K0
Material的布局原则
Material Design 指南通过源自印刷领域的设计元素 – 例如排版、网格、空白、缩放、颜色,和图像 – 来建立层次结构和传达所要表达的含义,并专注于带给用户沉浸式的体验。Material Design 采用来自印刷设计领域的工具,如基准网格和结构模版,通过重复视觉元素,结构网格以及跨平台和屏幕尺寸的间距,促进不同环境下设计的一致性。这些布局可通过缩放来适应任何屏幕大小,这简化了创建可扩展应用的过程。
Jean
2018/10/30
1.1K0
Material的布局原则
select的onchange事件和onclick事件区别
一句话理解,onchange是当发生改变时触发事件,onclick当被点击时触发事件
JaneYork
2023/10/11
9150
select的onchange事件和onclick事件区别
select标签添加onclick()事件的兼容写法
以上代码片是可以在Firefox和IE9下运行的,但是它在我的360浏览器上就是无效的,究其原因还是IE版本的问题(存在兼容性问题), 也就是:老版本只能这样 <select onclick() ></select>
ZONGLYN
2019/08/08
7.9K0
点击加载更多

相似问题

反应材料UI包装TableRow

13

反应材料-UI与路由器

20

如何将<Link>反应路由器添加到材料表中?

32

在每个材料UI TableRow旁边添加IconButton组件

13

TableRow材料之间的间距-UI

31
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档