本文采用两种方式,在OpenGL中实现放大缩小功能:

方式一. 改变“视点”与模型之间的距离【改变模型视点变换矩阵】

对于这种方式存在三个问题需要解决:

①    缩放过程过渡平滑

②    当模型放大或缩小到一定程度,减慢其缩放速度,以免视点很快地贴近模型或消失在场景中

③    防止视点进入模型内部

解决方案:

使用反正切函数:y=0.5*arctan(0.1*x)+0.25*PI,函数图像如下图:

当模型放大时,x--,  y减小

当模型缩小时,x++, y增大

y减小时,即∠APM变小,视点A向M点移动(由于y>0,所以A永远不会到达M点)

y增大时,即∠APM变大,视点A远离M点

视点与物体中心的距离由三部分组成【AM+MN+NO】,这样可以保证无论模型处于什么姿态,都可以保证物体不会跨越近裁截面(问题③)

1 void setEyeAndRadius()
2 {
3 double angle = 0.5 * atan( 0.1 * x) + 0.25 * PI;
4 // AM=tan(angle) MN=0.1 NO=sqrt(3.0)
5   radius = tan(angle) + sqrt( 3.0 ) + 0.1 ;
6
7 // 从聚焦点指向视点的向量 OA向量
8   vector3dd a(eye - target);
9
10 // 将其单位化
11   a.normailize();
12
13 eye = a * radius + target;
14 }

方式二. 改变投影变换的fovy夹角【改变投影变换矩阵】

fovy越小,模型越大;fovy越大,模型越小。

使用反正切函数:y=arctan(0.1*x)+0.5*PI,函数图像如下图:

当模型放大时,x--,  y减小(fovy减少)

当模型缩小时,x++, y增大 (fovy增大)

1 void setFovy()
2 {
3 camFovy = 180.0 / PI * (atan( 0.1 * x) + 0.5 * PI);
4 }

对于模型浏览而言,第二种方式更简洁,也易于理解,不用考虑视点会进入模型的情况。

效果图如下:

原图:

放大:

缩小:

转载于:https://www.cnblogs.com/kekec/archive/2010/08/14/1799772.html

OpenGL放大缩小实现相关推荐

  1. QT OpenGL图形放大缩小旋转移动

    由于要在OpenGL中实现放大缩小旋转和移动的效果,故要重写鼠标事件 放大缩小 重写void wheelEvent(QWheelEvent *event)函数 void zScale(float dz ...

  2. 最新版CameraX入门(拍照、存储展示、切换前后摄像头、手电筒、闪光灯、手势伸缩、双击放大缩小)

    基于官网demo,增加了对焦.手势缩放.手电.闪光灯等操作 Camera的预备知识 熟悉的大佬可以跳过 Surface.SurfaceView.SurfaceHolder这三个是啥 Surface是什 ...

  3. CSS动画效果无限循环放大缩小

    效果图: CSS动画效果无限循环放大缩小 <image class="anima" mode="widthFix" @click="nav&qu ...

  4. HTML5 canvas处理图片的各种效果,包括放大缩小涂鸦等

    http://www.htmleaf.com/ziliaoku/qianduanjiaocheng/201502151385.html jQuery 缩放 旋转 裁剪图片 Image Cropper ...

  5. Android多点触摸交互处理,放大缩小图片

    多点触摸(MultiTouch),指的是允许计算机用户同时通过多个手指来控制图形界面的一种技术.与多点触摸技术相对应的就是单点触摸,单点触摸的设备已经有很多年了,小尺寸的有触摸式的手机,大尺寸的最常见 ...

  6. SVG 基本知识:SVG 放大缩小之 viewbox 初探 (1)

    最近做了一个关于SVG的应用的技术分享网站svgtrick.com,会同步一些文章到这里来,更多的可以去网站看看. 接触过SVG都知道,SVG有自己的一套坐标视窗系统,理解它对于在SVG的使用,特别是 ...

  7. ai里为什么不能随意放大缩小_平面设计基础知识:平面设计师应该熟练掌握的软件之AI。...

    今天给大家整理了一下,平面设计基础知识中平面设计师应该熟练掌握的软件之AI.这个系列共有五篇,其他几篇都在首页,可以去看一下,有任何问题可以提出来,下面我们一起看一下平面设计基础知识中平面设计师应该熟 ...

  8. 放大缩小html文字,jquery放大缩小文字

    jquery放大缩小文字 $(function(){ $("span").click(function(){ var theSize = $("#title") ...

  9. css3 animation(左右摆动) (放大缩小)

    左右摆动: @-webkit-keyframes roundRule{0%, 100%{-webkit-transform: rotate(-15deg);}50%{-webkit-transform ...

最新文章

  1. Exchange 2010 EMC 删除 DisconnectedMailbox
  2. WindowsPE 第七章 资源表
  3. 字母全排列快速算法C代码
  4. 美团在Redis上踩过的一些坑-2.bgrewriteaof问题
  5. select、poll、epoll优缺点
  6. kotlin中List,Map,数组的使用
  7. 苹果php集成环境安装包,MacOS平台免费的PHP集成开发环境
  8. 网站pc端和手机端视频的处理
  9. MySql中 where IN 中多个参数查询
  10. 【官网】飞腾 2000 处理器
  11. 大数据人工智能时代你跟上步伐了吗?(号称第四次技术革命)
  12. 1093. 大样本统计-正常统计
  13. uva11134 -Fabled Rooks
  14. (转)正则表达式中的点星问号 .*? 或点星加号 .*+ 是什么意思
  15. 深度学习各类性能指标含义解释
  16. 数据仓库工具箱 第10节 金融服务
  17. 【ML】LambdaMART算法原理--应用场景
  18. Javascript轻应用命令行工具
  19. 闲鱼客服工具/消息管理系统:可以让客服放下手机,在电脑上管理闲鱼店铺的咨询信息
  20. 苏格拉底《临死前的演说》

热门文章

  1. 什么是ORM框架?常用的orm框架有哪些?能否不用ORM框架直接使用SQL语句创建WebAPI?
  2. 大学计算机长文档排版教学视频教程,大学计算机基础中Word长文档排版的教学思考...
  3. matlab sskf,[转载]fortran语言常用函数
  4. 【品牌营销策划方案】2020碧桂园x江小白创意引爆策略方案【白酒】【IP】【创意营销】
  5. Excel中如何输入前面带0的数值
  6. 3d建模电脑配置要求
  7. SPA 项目 之 后台接口文档
  8. JavaScript红皮书学习笔记
  9. 轻松完成word格式的接口文档
  10. 写一个可以一键统一调整word文档格式的程序