投影方式中物体在View上的投影位置

  在之前对多边形数据进行裁剪时《VTK笔记-裁剪分割-不规则闭合圈选裁剪-vtkImplicitSelectionLoop类》,显示的下图的效果;在圆球上进行垂直于视平面的一个五边形的裁剪,一开始的目的是在视平面上将五边形范围内的数据进行删除。却没想到最终的效果是下图这个样子,可以看到五边形的裁剪范围向图像的中心方向偏移;这个是正确的呢?还是错误的呢?

  先说结论,是正确的。在认真学习VTK的相机正交模式和透视模式后,得知一般情况下相机是使用透视模式获取物体在前后裁剪平面范围内的像素投射在以相机为中心方向上与前裁剪平面上的交点位置,构成了一个由透视投影得到的二维渲染图像如果是采用正交投影,那么就不会有这种远小近大的视觉效果,在视平面上的裁剪就是选择范围内的裁剪。
  例如,在以焦点为中心的立方体上,以视平面上的一个长方形范围进行裁剪,这里只使用水平面上的投影示意图为例。如果是要裁剪掉投影在前裁剪平面上的所有显示像素,就不能根据垂直与前裁剪平面的范围裁剪立方体,如果按照这种方式进行裁剪,就会在前裁剪平面上生成一个类似上图的效果,可以看到黑色范围投影在前裁剪平面是和选定的范围有偏移。

  真正要裁剪的范围是以相机为中心,连接相机坐标和前裁剪平面上选择范围上点的坐标,与后裁剪平面上的交点形成了后裁剪平面上的圈选范围,这两个选择范围与立方体的交集就是要被裁剪掉的范围。这样在前裁剪平面形成的渲染图像就是一个看上去被圈选删除的结果。


  上图,是一个相机的锥视体的示意图。其中eye是眼睛位置也就是相机位置,np是近裁剪平面(前裁剪平面/视平面),fp是远裁剪平面(后裁剪平面)。N是相机到近裁剪平面的距离,F是相机到远裁剪平面的距离。投影面可以选择任何平行于近裁剪平面的平面,这里我们选择近裁剪平面作为投影平面。p是视椎体的前后裁剪平面中间的点,p’是经过相机变换后投影在前裁剪平面上的点。
  p经过怎么样的计算才能得到p’呢,首先由相机坐标(eye)和p坐标形成一条直线,直线与视平面np相交与p’,可以通过vtkPlane或者vtkPlaneSource计算出这个相交点的世界坐标,该坐标可以换算成相机上的view坐标;同样与平面fp相交一点,就是p在fp上的投影,前面两个实际裁剪范围就是由前裁剪平面和后裁剪平面形成的椎体范围。

参考资料

1.图形学扫盲–(2)透视投影(Perspective Projection)

VTK笔记-相机vtkCamera-投影方式与裁剪范围相关推荐

  1. VTK控制相机实现水平翻转与垂直翻转

    目录 vtkCamera投影示意图: vtkCamera运动方向示意图 操作相机实现水平翻转 操作相机实现垂直翻转 参考资料 vtkCamera投影示意图: vtkCamera运动方向示意图 操作相机 ...

  2. OpenGL ES之九——相机和投影

    概述 这是一个系列的Android平台下OpenGl ES介绍,从最基本的使用最终到VR图的展示的实现,属于基础篇.(后面针对VR视频会再有几篇文章,属于进阶篇) OpenGL ES之一--概念扫盲 ...

  3. VTK:在多面体数据上使用裁剪和封盖用法实战

    VTK:在多面体数据上使用裁剪和封盖用法实战 程序输出 程序完整源代码 程序输出 程序完整源代码 #include <vtkActor.h> #include <vtkCamera. ...

  4. VTK:VTK 的相机模型用法实战

    VTK:VTK 的相机模型用法实战 程序输出 程序完整源代码 程序输出 程序完整源代码 #include <vtkAppendFilter.h> #include <vtkCamer ...

  5. VTK:相机模糊CameraBlur用法实战

    VTK:相机模糊CameraBlur用法实战 程序输出 程序完整源代码 程序输出 程序完整源代码 #include <vtkActor.h> #include <vtkCamera. ...

  6. VTK笔记——插值样条曲线采样

    有时候我们想通过在样条曲线上得到更多的点,比如用这些点来与另一条曲线连通生成三角条,让曲线在可视化的时候分辨率更高,等等,就需要用到曲线插值采用.最常见的是样条曲线插值采样. 曲线已经有了情况下(关于 ...

  7. Ajax和JSON-学习笔记02【JQuery方式实现Ajax】

    Java后端 学习路线 笔记汇总表[黑马程序员] Ajax和JSON-学习笔记01[原生JS方式实现Ajax] Ajax和JSON-学习笔记02[JQuery方式实现Ajax] Ajax和JSON-学 ...

  8. android编程 自动裁剪图片,Android编程实现调用相册、相机及拍照后直接裁剪的方法...

    本文实例讲述了Android编程实现调用相册.相机及拍照后直接裁剪的方法.分享给大家供大家参考,具体如下: package com.cvte.health.phone; import java.io. ...

  9. opencv python 直方图反向投影_python OpenCV学习笔记直方图反向投影的实现

    本文介绍了python OpenCV学习笔记直方图反向投影的实现,分享给大家,具体如下: 它用于图像分割或寻找图像中感兴趣的对象.简单地说,它创建一个与我们的输入图像相同大小(但单通道)的图像,其中每 ...

最新文章

  1. 日期排序react_react+antd 步骤条改为时间顺序条
  2. ThreadLocal类
  3. [LeetCode]Add Binary
  4. Xcode环境变量,Build Settings参数
  5. Xtrabackup备份MySQL
  6. 儿童学文字编程python_手把手教你python数字知识
  7. 优秀程序员必备素质——快速调试
  8. 跨链永续衍生品协议AntiMatter完成150万美元种子轮融资,NGC领投
  9. Java8 List<对象> 转 Set、Map(高级)、排序、分组、统计
  10. apply()、call()与bind()的用法与区别
  11. 第八届蓝桥杯第三题承压计算
  12. 怎么让背景铺满整个页面_word怎么让背景图片铺满整个页面
  13. SAP中会计凭证红蓝冲相关分析测试笔记续(手工反记账红冲)
  14. 解决启动IIS发生意外错误 0x8ffe2740
  15. 绝了,GitHub程序员的微服务资源库太强了,每份学习手册都优质详细
  16. html将字符串按逗号分隔,js如何截取以逗号隔开的字符串
  17. Ubuntu 16.04 安装显卡驱动(详细!)
  18. ssh端口转发(隧道技术)
  19. 【Java基础】(八)方法(即C等语言中的函数)
  20. Line-line Intersection

热门文章

  1. IDEA:如何创建 Android 项目
  2. maven项目——使用jedis操作redis
  3. 费希尔DVC6200p数字式阀门控制器
  4. 直播行业的未来增量:一边内容升级,一边驱动演艺
  5. 流程控制之分支结构:英制单位英寸与公制单位厘米互换
  6. 十里春风不如你,三里桃花不及卿
  7. java 用户上传头像
  8. 如何构建游戏安全护城河
  9. Java for循环嵌套
  10. 杨凌九立机器人农博园观后感_陕西乡村旅游精彩亮相第25届杨凌农高会