前序

前段时间学习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. windows+CMake+mingw 搭建c c++开发环境

    layout: post title: "windows+CMake+mingw 搭建c c++开发环境" date: 2018-03-30 22:23:06 tags: wind ...

  2. hibernate框架学习笔记1:搭建与测试

    hibernate框架属于dao层,类似dbutils的作用,是一款ORM(对象关系映射)操作 使用hibernate框架好处是:操作数据库不需要写SQL语句,使用面向对象的方式完成 这里使用ecli ...

  3. 2018.3.29 div内容格式设置

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

  4. 听翁恺老师mooc笔记(10)--结构

    定义结构: 在程序里,如果想要表达一个数据就需要一个变量,而每个变量又都需要一个类型,之前学过C语言中有int.double.float.char等这些基础类型,还有指针.数组等.如果你要表达的数据比 ...

  5. 2017-2018-1 Java演绎法 第四五周 作业

    团队任务:撰写<需求规格说明书> 团队组长:袁逸灏 本次编辑:刘伟康 流程.分工.比例 (比例按照任务的费时.难度和完成情况估算) 流程 确定任务 -→ 分配任务 -→ 各组员完成各自任务 ...

  6. 2017-2018-1 1623 bug终结者 冲刺002

    bug终结者 冲刺002 by 20162329 张旭升 今日冲刺任务: 能够显示主菜单和功能 游戏需要提供主菜单让玩家进行游戏设置,同时能能够把地图文件中的信息转换成为图像显示到游戏界面上 能够实现 ...

  7. Microsoft dynamic sdk中join应该注意的问题.

    QueryExpression queryNextSeq = new QueryExpression { EntityName = "ep_prodoperationsequence&quo ...

  8. babel基本用法

    babel-cli babel-cli是本地使用编译js文件 1.安装: cnpm i babel-cli babel-preset-env -D 2.配置packjson: "script ...

  9. 剑指offer-反转单词顺序列

    题目描述 牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上.同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思.例如,"st ...

  10. 新概念英语(1-99)Ow!

    Lesson 99 Owl! 啊哟! Listen to the tape then answer this question. Must Andy go to see the doctor?听录音, ...