GLFW+OpenGL三维空间旋转模型的算法
在三维软件中,用鼠标控制三维模型旋转是很必要的,可以方便使用者观察模型,具有诸多优势,那么如何实现呢?
有两种方案,一种是控制模型旋转,这种方法将着色器中的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三维空间旋转模型的算法相关推荐
- 三维空间坐标的旋转算法详解_矩阵描述三维空间旋转
本节简单介绍用矩阵来描述旋转.在二维平面上,复数无疑是描述旋转的最佳工具:然而推广到三维空间中,却要动用到"四元数"了.为了证明四元数的相关结论,我们需要三维旋转的矩阵描述.最一般 ...
- |Boids|鸟群模型|鸟群算法|学习笔记 - 论文学习
本文基于Craig Reynolds于1986年发布的<Flocks, Herds, and Schools: A Distributed Behavioral Model>进行学习和总结 ...
- 睿智的目标检测——YoloV7-Tiny-OBB旋转目标检测算法部署
YoloV7-OBB旋转目标检测算法部署 学习前言 源码下载 安装TensorRT 1.TensorRT简介 2.下载TensorRT 3.TensorRT安装 安装torch2trt 1.torch ...
- OPENGL读取OBJ模型(包围盒、法向等计算)附加源码与资源下载页面
OPENGL读取OBJ模型 标签(空格分隔): OPENGL/C++ 哈哈,先贴出下载链接好吧.下载页面 首先大家不要害怕,读取obj模型听上去很高端很麻烦,其实当你真正了解obj模型的格式,以及OP ...
- 【转】OpenGL实现太阳系模型
转自:http://www.juwends.com/tech/opengl/opengl-solar-system.html OpenGL是一个非常强大的图形引擎.传说当下最流行的图形引擎有两套,其中 ...
- OpenGL实现太阳系模型 —— Juwend
OpenGL实现太阳系模型 发表于 2012 年 12 月 30 日 由 Juwend OpenGL是一个非常强大的图形引擎.传说当下最流行的图形引擎有两套,其中之一就是Windows平台上最常用的D ...
- android 图片浏览器旋转,OpenGL纹理旋转及翻转问题详解
大家好,我是程序员kenney,今天给大家讲解一下Android上OpenGL开发可能会遇到的一些纹理旋转及翻转的问题,其中有些原理在其它平台上如ios,osx上也是类似的.纹理旋转的问题一定要搞清楚 ...
- 机器学习三要素之数据、模型、算法
参考:https://gitbook.cn/gitchat/column/5ad70dea9a722231b25ddbf8/topic/5b1086eccad6fe44db4c1268 1. 机器学习 ...
- 讲解AI三大方向的模型与算法!
↑↑↑关注后"星标"Datawhale 每日干货 & 每月组队学习,不错过 开课吧教育 公开课:人工智能的模型与算法 AI应用会是人类最好的工具, 是人类智能的延伸和拓展. ...
最新文章
- Ubuntu18.04安装Multiwfn
- spring核心之IOC
- java 创建线程_【80期】说出Java创建线程的三种方式及对比
- 设计师需要收藏|一起来看看UI设计的配色专辑
- 我们用计算机做什么大餐英语怎么说,感恩用英语怎么说
- 深入浅出LVM on linux
- 前后端分离项目如何部署_不用Docker前后端分离项目如何快速部署
- matlab数字信号处理实验报告,Matlab数字信号处理实验报告.pdf
- php连接mysql MariaDB_PHP+MariaDB数据库操作基本技巧
- iText - OCR 截图识字 - 新版小幅更新
- 2011美剧季终/剧终时间表。
- java mysql 端口_如何在JAVA中建立MySQL连接?在locahost上设置的端口号是多少?
- 英语中定语和状语的区别
- 【nowcoder 224882】牛牛和数组操作(贪心)(剪枝)(区间DP)
- Unity的C#编程教程_61_委托和事件 Delegates and Events 详解及应用练习
- maven提示:Failed to execute goal on project ...: Could not resolve dependencies for project ...
- 1001 害死人不偿命的(3n+1)猜想 (15分) PAT (Basic Level) Practice (中文)C语言版
- GPS北斗授时卡(pci授时卡)卫星授时技术参数介绍
- ppt模板文字拆分怎么制作?
- 2020年 前端面试问题总结:附答案