前序

前段时间学习3D MAX,一对比就发现差距是相当大。我也做了一个三维展示的小软件,但是拖拽操作非常不友好,如果场景的尺寸特别大,会导致拖不动,尺寸过小会导致轻轻拖一下,模型就不知道飞哪去了。我是每次鼠标移动都是让模型移动相同的距离,所以就出现了这种情况。下面就简单说一下,怎么做到模型跟随鼠标移动,就像鼠标抓着模型到处甩的效果。

方法



我们在设置OpenGL的投影矩阵的时候,需要设置近平面和远平面,这里,BP和DQ分别表示近平面和远平面。除此外,我们还需要设置摄像机的位置,这里我们用A点代表摄像机,摄像机的角度为2θ,假设观察的物体位于CF平面上,我们的屏幕分辨率是X * Y,OpenGL的视口长宽设置为屏幕大小,那么,我们可以很容易的算出物体所在表面的高度CF = tanθ * AC。如果鼠标在纵向拖动的像素距离为ybits,那么相应的物体需要在Y轴方向移动的距离ydistance = ybits / Y * CF = ybits / Y * AC * tanθ。现在只要能取到AC的长度就能算出物体需要移动的距离。

深度缓冲

在OpenGL中我们可以通过获取鼠标所在点的深度值,然后通过gluUnProject函数就能得到这个点所在的z轴坐标。

int winX, winY;     //winX和winY分别是窗口的xy坐标
double x, y, z; //鼠标所在点在OpenGL坐标系中的坐标
float depth; //鼠标点所在的深度值
int viewport[4]; //视口数据
double mvMatrix[16], projectMatrix[16]; //当前的modelview矩阵和projection矩阵 glGetIntegerv(GL_VIEWPORT, viewport); //获取当前视口
glGetDoublev(GL_MODELVIEW_MATRIX, mvMatrix); //获取当前的modelview矩阵
glGetDoublev(GL_PROJECTTION_MATRIX, projectMatrix); //获取当前的projection矩阵 //鼠标当前的坐标为mouseX, mouseY, 均为int类型
winX = mouseX;
winY = viewport[3] - mouseY; //Windows上的点坐标远点位于屏幕左上角
glReadPixels(winX, winY, 1, 1, GL_DEPTH_COMPONENT, &depth); //获取深度,保存于depth
//gluUnProject(x坐标,y坐标,深度,modelview矩阵,projection矩阵,OpenGL的x坐标,OpenGL的y坐标,OpenGL的z坐标)
gluUnProject((GLdouble)winX, (GLdouble)winY, (GLdouble)depth, mvMatrix, projectMatrix, &x, &y, &z);

最后的计算

知道了鼠标点在OpenGL坐标系的具体坐标后,可以通过摄像机的坐标与点坐标之间运算,得到一个大概的移动距离(通过屏幕坐标反算OpenGL坐标会有误差)

OpenGL鼠标拖拽的更多相关文章

  1. CSharpGL(20)用unProject和Project实现鼠标拖拽图元

    CSharpGL(20)用unProject和Project实现鼠标拖拽图元 效果图 例如,你可以把Big Dipper这个模型拽成下面这个样子. 配合旋转,还可以继续拖拽成这样. 当然,能拖拽的不只 ...

  2. JavaScript鼠标拖拽特效及相关问题总结

    #div1{width:200px;height:200px;background:red;position:absolute;} #div2{width:200px;height:200px;bac ...

  3. 一款基于jQuery的支持鼠标拖拽滑动焦点图

    记得之前我们分享过一款jQuery全屏广告图片焦点图,图片切换效果还不错.今天我们要分享另外一款jQuery焦点图插件,它的特点是支持鼠标拖拽滑动,所以在移动设备上使用更加方便,你只要用手指滑动屏幕即 ...

  4. 【狼】unity 鼠标拖拽物体实现任意角度自旋转

    主要涉及函数 Input.GetAxis(“Mouse x”) 可取得鼠标横向(x轴)移动增量 Input.GetAxis(“Mouse y”) 可取得鼠标竖向(y轴)移动增量 通过勾股定理获取拖拽长 ...

  5. NGUI对象跟随鼠标拖拽移动

    public Camera WNGUICamera; Vector3 _WoldPosition;//指针的初始位置 // Vector3 _WoldAng; Vector3 WscreenSpace ...

  6. 鼠标拖拽定位和DOM各种尺寸详解

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  7. Arcgis for qml - 鼠标拖拽移动

    以实现鼠标拖拽文本图层为例 GitHub:ArcGIS拖拽文本 作者:狐狸家的鱼 目的是利用鼠标进行拖拽. 实现两种模式,一种是屏幕上的拖拽,第二种是地图上图层的挪动. 屏幕上的拖拽其实跟ArcGIS ...

  8. html5的鼠标拖拽

    鼠标拖拽 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF- ...

  9. javascript鼠标拖拽的那些事情

    <html> <head> <title>javascript鼠标拖拽的那些事情</title> <meta http-equiv="C ...

随机推荐

  1. linux --> Event Loop介绍

    Event Loop介绍 想要理解Event Loop,就要从程序的运行模式讲起.运行以后的程序叫做"进程"(process),一般情况下,一个进程一次只能执行一个任务. 如果有很 ...

  2. 痛吻过YY寻找到真爱的三非渣本春招之路

    写下这篇文章可能就不是大家乐于见闻的面经了,更多是深入一些面试细节. 前言 我猜拿到了BAT等一线互联网公司Offer的小伙伴或者那些老鸟看到这条标题的时候会不屑一顾,认为YY这种级别的公司是属于二线 ...

  3. SQL注入之Sqli-labs系列第一篇

    在开始接触渗透测试开始,最初玩的最多的就是Sql注入,注入神器阿D.明小子.穿山甲等一切工具风靡至今.当初都是以日站为乐趣,从安全法实施后在没有任何授权的情况下,要想练手只能本地环境进行练手,对于sq ...

  4. Linux安装Python2.7.9

    1.下载python wget https://www.python.org/ftp/python/2.7.9/Python-2.7.9.tgz 2.解压.编译安装 tar -zxvf Python- ...

  5. alpha冲刺第四天

    一.合照 二.项目燃尽图 三.项目进展 今天实现了登录界面和服务器的连接了,牵手成功. 一些具体的界面细化实现,一些button的响应实现 四.明日规划 登录界面和服务器的连接实现耗费了太多时间,接下 ...

  6. 201621123062《java程序设计》第12周作业总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多流与文件相关内容. 思维导图: 2. 面向系统综合设计-图书馆管理系统或购物车 使用流与文件改造你的图书馆管理系统或购物车. 2. ...

  7. android 广播,manifest.xml注册,代码编写

    1.种 private void downloadBr(File file) {   // 广播出去,由广播接收器来处理下载完成的文件   Intent sendIntent = new Intent ...

  8. django模型——数据库(二)

    模型--数据库(二) 实验简介 模型的一些基本操作,save方法用于把对象写入到数据库,objects是模型的管理器,可以使用它的delete.filter.all.order_by和update等函 ...

  9. EXT3文件系统误删除导致文件系统中的邮件丢失恢复方法

    一.故障描述 由8块盘组成的RAID5, 上层是EXT3文件系统,由于误删除导致文件系统中的邮件丢失 二.镜像磁盘为防止数据恢复过程中由于误操作对原始磁盘造成二次破坏, 使用winhex软件为每块磁盘 ...

  10. JS中的 map, filter, some, every, forEach, for...in, for...of 用法总结

    1.map 有返回值,返回一个新的数组,每个元素为调用func的结果. let list = [1, 2, 3, 4, 5]; let other = list.map((d, i) => { ...