在三维软件中,用鼠标控制三维模型旋转是很必要的,可以方便使用者观察模型,具有诸多优势,那么如何实现呢?

有两种方案,一种是控制模型旋转,这种方法将着色器中的model进行旋转变换即可;另一种是旋转摄像头,这种方法其实利用了相对运动的原理,要让模型旋转,其实也就是让观察者在以机器人模型为原点的球面坐标系中运动,当然运动之后,观察者也要旋转相应的角度。

                                  

这样一看是第一种方法简单,但是当模型位置不能动时(如要进行仿真,模型有确定的坐标),移动观察者变成唯一的选择。

要实现旋转三维模型,第一步是定义一个鼠标的反馈函数,这个函数要将鼠标在屏幕中横向移动值转换为方位角,纵向移动值转换为天顶角,函数的调用需要按钮反馈函数以及鼠标移动函数的辅助。

按下鼠标右键的反馈:

void mouse_button_callback(GLFWwindow* window, int button, int action, int mods)
{
    if (action == GLFW_PRESS) switch(button)
            {
            case GLFW_MOUSE_BUTTON_RIGHT:
                glfwSetCursorPosCallback(window, mouse_callback2);
                break;
            default:
                return;
            }
    if (action != GLFW_PRESS)
        glfwSetCursorPosCallback(window, mouse_callback1);
    return;
}
void mouse_callback2(GLFWwindow* window, double xpos, double ypos)
{
    if (firstMouse)
    {
        lastX = xpos;
        lastY = ypos;
        firstMouse = false;
    }
    float xoffset = 0.1*(xpos - lastX);
    float yoffset = 0.1*(lastY - ypos); // reversed since y-coordinates go from bottom to top
    lastX = xpos;
    lastY = ypos;
    //camera.ProcessMouseMovement(xoffset, yoffset);
    float r = sqrt(camera.Position.x * camera.Position.x + camera.Position.y * camera.Position.y + camera.Position.z * camera.Position.z);
    float x,y,z,afa,fi;
    if(camera.Position.x>=0)
    {
        afa = atan(camera.Position.z/camera.Position.x);
    }
    else
    {
        afa = atan(camera.Position.z/camera.Position.x)+3.1415926;
    }
    if(camera.Position.y>0)
    {
        fi = atan(camera.Position.x/(camera.Position.y*cos(afa)));
    }
    else
    {
        fi = atan(camera.Position.x/(camera.Position.y*cos(afa)))+3.1415926;
    }
    x = r*sin(fi+(yoffset)/180.0f*3.1415926)*cos(afa+(xoffset)/180.0f*3.1415926);
    y = r*cos(fi+(yoffset)/180.0f*3.1415926);
    z = r*sin(fi+(yoffset)/180.0f*3.1415926)*sin(afa+(xoffset)/180.0f*3.1415926);
    camera.update(glm::vec3(x, y, z),glm::vec3(0.0f, 1.0f, 0.0f), -90.0f+afa/3.1415926*180.0+xoffset-83.6598f, 0.0f+fi/3.1415926*180.0+yoffset-69.7911f);
}

firstMouse提前设为true。

afa、fi是原始位置对应的方位角和天顶角,由于存在tan的反三角函数,需要讨论正负,并在值发生跳跃的时候补上180度,让选择连续。

GLFW+OpenGL三维空间旋转模型的算法相关推荐

  1. 三维空间坐标的旋转算法详解_矩阵描述三维空间旋转

    本节简单介绍用矩阵来描述旋转.在二维平面上,复数无疑是描述旋转的最佳工具:然而推广到三维空间中,却要动用到"四元数"了.为了证明四元数的相关结论,我们需要三维旋转的矩阵描述.最一般 ...

  2. |Boids|鸟群模型|鸟群算法|学习笔记 - 论文学习

    本文基于Craig Reynolds于1986年发布的<Flocks, Herds, and Schools: A Distributed Behavioral Model>进行学习和总结 ...

  3. 睿智的目标检测——YoloV7-Tiny-OBB旋转目标检测算法部署

    YoloV7-OBB旋转目标检测算法部署 学习前言 源码下载 安装TensorRT 1.TensorRT简介 2.下载TensorRT 3.TensorRT安装 安装torch2trt 1.torch ...

  4. OPENGL读取OBJ模型(包围盒、法向等计算)附加源码与资源下载页面

    OPENGL读取OBJ模型 标签(空格分隔): OPENGL/C++ 哈哈,先贴出下载链接好吧.下载页面 首先大家不要害怕,读取obj模型听上去很高端很麻烦,其实当你真正了解obj模型的格式,以及OP ...

  5. 【转】OpenGL实现太阳系模型

    转自:http://www.juwends.com/tech/opengl/opengl-solar-system.html OpenGL是一个非常强大的图形引擎.传说当下最流行的图形引擎有两套,其中 ...

  6. OpenGL实现太阳系模型 —— Juwend

    OpenGL实现太阳系模型 发表于 2012 年 12 月 30 日 由 Juwend OpenGL是一个非常强大的图形引擎.传说当下最流行的图形引擎有两套,其中之一就是Windows平台上最常用的D ...

  7. android 图片浏览器旋转,OpenGL纹理旋转及翻转问题详解

    大家好,我是程序员kenney,今天给大家讲解一下Android上OpenGL开发可能会遇到的一些纹理旋转及翻转的问题,其中有些原理在其它平台上如ios,osx上也是类似的.纹理旋转的问题一定要搞清楚 ...

  8. 机器学习三要素之数据、模型、算法

    参考:https://gitbook.cn/gitchat/column/5ad70dea9a722231b25ddbf8/topic/5b1086eccad6fe44db4c1268 1. 机器学习 ...

  9. 讲解AI三大方向的模型与算法!

    ↑↑↑关注后"星标"Datawhale 每日干货 & 每月组队学习,不错过 开课吧教育 公开课:人工智能的模型与算法 AI应用会是人类最好的工具, 是人类智能的延伸和拓展. ...

最新文章

  1. Ubuntu18.04安装Multiwfn
  2. spring核心之IOC
  3. java 创建线程_【80期】说出Java创建线程的三种方式及对比
  4. 设计师需要收藏|一起来看看UI设计的配色专辑
  5. 我们用计算机做什么大餐英语怎么说,感恩用英语怎么说
  6. 深入浅出LVM on linux
  7. 前后端分离项目如何部署_不用Docker前后端分离项目如何快速部署
  8. matlab数字信号处理实验报告,Matlab数字信号处理实验报告.pdf
  9. php连接mysql MariaDB_PHP+MariaDB数据库操作基本技巧
  10. iText - OCR 截图识字 - 新版小幅更新
  11. 2011美剧季终/剧终时间表。
  12. java mysql 端口_如何在JAVA中建立MySQL连接?在locahost上设置的端口号是多少?
  13. 英语中定语和状语的区别
  14. 【nowcoder 224882】牛牛和数组操作(贪心)(剪枝)(区间DP)
  15. Unity的C#编程教程_61_委托和事件 Delegates and Events 详解及应用练习
  16. maven提示:Failed to execute goal on project ...: Could not resolve dependencies for project ...
  17. 1001 害死人不偿命的(3n+1)猜想 (15分) PAT (Basic Level) Practice (中文)C语言版
  18. GPS北斗授时卡(pci授时卡)卫星授时技术参数介绍
  19. ppt模板文字拆分怎么制作?
  20. 2020年 前端面试问题总结:附答案

热门文章

  1. 开发人工智能使用哪种编程语言好
  2. 厦门大学校区计算机考试,厦门大学计算机等级考试报名
  3. 又闹分裂?Node.js 被 fork 出一个项目 Ayo.js
  4. dhcp服务器显示dns服务器更新挂起,如何动态更新DNS记录
  5. 懒癌福音!自带叠被功能的冰火两重天智能被!
  6. 使用IBM InfoSphere Guardium REST API
  7. GAMES101-现代计算机图形学学习笔记(作业02)
  8. Inception网络
  9. 攻防世界-reverse-easyRE1
  10. 计算机组成原理oe表示什么意思,计算机组成原理课后习题答案解析