相机变换与Ray-Casting
p { margin-bottom: 0.1in; direction: ltr; line-height: 120%; text-align: justify; orphans: 0; widows: 0 }
世界坐标系:本文都记为xyz坐标系,在体绘制中可以理解为物体空间坐标系。xyz坐标系可以根据体数据的特点人为规定,比如对于一个立方体数据,可选一个顶点为原点,与该顶点相连的三条棱为x,y,z轴。
UVN系统:本文都记为UVN坐标系,可以理解为图像空间坐标系。当物体空间坐标系确定后,可认为物体不动,因此多角度观察物体等价于将UVN先绕xyz旋转再平移,得到一个新的坐标系(在OpenGL中,其实是让UVN坐标系不动,让物体所在的xyz坐标系绕UVN旋转平移,这在我的其他博客中有详细介绍),再相对这个新坐标系的某个固定方向观察物体。之所以先旋转,是因为UVN与xyz起初是重合的,原点重合使得旋转不会产生附加位移。我们要把这个前提作为坐标变换的起始条件,因为这样能使变换过程更加简洁,让人更容易理解。
一、旋转:
三个基向量U,V,N分别指向相机的右方、上方和后方从而构成右手坐标系,相机则处于坐标原点。
1、选定相机eye的位置(物体空间坐标系下,下同)
2、选定观察点位置lookat(一般取xyz坐标系的原点)
3、确定N轴正向的方向向量
方向由lookat指向eye
4、确定投影面的方向,这一步需要使用辅助向量UP,产生U轴
5、根据右手系的特点,确定V轴
这样,UVN轴就确定了。取UVN轴的单位向量u,v,n,则UVN坐标系就是xyz坐标系乘旋转矩阵R=[u,v,n]得到的。简要证明如下:
在xyz坐标系中取一点P(x, y, z),乘旋转矩阵R后,位置变为P1
其实任何坐标都有两个基本要素:坐标值和基。三维空间中任意一个向量都可以由三个线性无关的向量的线性组合表示,所以三维空间中的点可以由三个线性无关的向量+三个组合系数确定。因此
基 = 三个线性无关的向量
坐标值 = 三个组合系数
我们一般使用的坐标
其真实含义是
它的基是x,y,z轴正向的单位向量。因此
其实是以为基的坐标,也可理解成以U,V,N为坐标轴下的坐标,坐标值为
与变换前相同,即P相对于xyz轴的位置与P1相对于UVN轴的位置相同。于是,从位移的相对性我们可以认为xyz---->UVN经历的旋转与P---->P1经历的旋转相同,从而UVN坐标系就是xyz坐标系乘旋转矩阵R=[u,v,n]得到的得证。
二、平移
平移矩阵T为4x4矩阵
xyz坐标系经旋转、平移后得到UVN坐标系,变换矩阵C = TR
若在UVN坐标系中有一点P,坐标为
欲求其在xyz坐标系中的坐标
有下式
三、投影
为理解方便,可以选取-N轴的方向为投影方向,以N轴在xoy平面的投影为辅助向量UP,以U,V轴的正方向为图像的两条边,UVN坐标系的原点为图像的原点,选定图像大小后,从图像面投出一簇平行射线(每个像素点对应一条射线),对每条射线上体素的不透明度及颜色值进行累加,得出每个像素灰度值。
下面的体数据是一个白色的大正方体(200x200x200),里面有一个红色的球体,球体里面有一个黄色的小正方体。
xyz坐标原点:大正方体内侧顶点
lookat = (0, 0, 0)
图一:eye = (1, 1, 1), UP = (1, 1, 0), T = (75, 350, 450)
图二:eye = (-1, -1, 1), UP = (-1, -1, 0), T = (125, -150, 450)
图三:eye = (1, 1, 1), UP = (1, 1, 0), T = (75, 350, 450)
采用公式
但采用合成的顺序与论文相反,为从前到后累加,每条入射光线上等间距取140个点进行合成。射入体数据的光线颜色的初值都为0。
相机变换与Ray-Casting的更多相关文章
- 体绘制(Volume Rendering)概述之4:光线投射算法(Ray Casting)实现流程和代码(基于CPU的实现)
转自:http://blog.csdn.net/liu_lin_xm/article/details/4850630 摘抄“GPU Programming And Cg Language Primer ...
- 体绘制(Volume Rendering)概述之3:光线投射算法(Ray Casting)原理和注意要点(强烈推荐呀,讲的很好)
转自:http://blog.csdn.net/liu_lin_xm/article/details/4850609 摘抄“GPU Programming And Cg Language Primer ...
- OpenGL变换
概述 OpenGL变换矩阵 实例:GL_MODELVIEW矩阵 实例:GL_PROJECTION矩阵 概述 OpenGL管线中,在光栅化操作之前,包括顶点位置与法线向量的几何数据经顶点操作与图元装配操 ...
- 【Android Developers Training】 65. 应用投影和相机视图
注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...
- Android OpenGL ES 开发(五): OpenGL ES 使用投影和相机视图
OpenGL ES环境允许你以更接近于你眼睛看到的物理对象的方式来显示你绘制的对象.物理查看的模拟是通过对你所绘制的对象的坐标进行数学变换完成的: Projection - 这个变换是基于他们所显示的 ...
- 透视投影(Perspective Projection)变换推导
透视投影是3D固定流水线的重要组成部分,是将相机空间中的点从视锥体(frustum)变换到规则观察体(Canonical View Volume)中,待裁剪完毕后进行透视除法的行为.在算法中它是通过透 ...
- OpenGL变换【转】
http://www.cnblogs.com/hefee/p/3811099.html OpenGL变换 概述 OpenGL变换矩阵 实例:GL_MODELVIEW矩阵 实例:GL_PROJECTIO ...
- 基本3D变换之World Transform, View Transform and Projection Transform
作者:i_dovelemon 来源:CSDN 日期:2014 / 9 / 28 主题:World Transform, View Transform , Projection Transform 引言 ...
- (转)使用OpenGL显示图像(四)运用投影与相机视角
运用投影与相机视角 编写:jdneo - 原文:http://developer.android.com/training/graphics/opengl/projection.html 在OpenG ...
随机推荐
- [bzoj3626][LNOI2014]LCA
Description 给出一个$n$个节点的有根树(编号为$0$到$n-1$,根节点为$0$). 一个点的深度定义为这个节点到根的距离$+1$. 设$dep[i]$表示点$i$的深度,$lca(i, ...
- supermap iobect .net 7.1.2 图例的拆分
LayoutSelection objLytSelect = m_MapLayoutControl.MapLayout.Selection;//.Selection; //LayoutSelectio ...
- TCP的三次握手(建立连接)和四次挥手(关闭连接)
参照: http://course.ccniit.com/CSTD/Linux/reference/files/018.PDF http://hi.baidu.com/raycomer/item/94 ...
- C#客户端的异步操作
上篇博客[用Asp.net写自己的服务框架] 我讲述了如何实现自己的服务框架,但我想很多人应该用过WebService这类服务框架,相比起来,似乎还缺少什么东西, 是的,我也感觉到了.比如:我可以很容 ...
- Zabbix监控
安装zabbix首先需要安装Nginx+Mysql+PHP,然后再安装zabbix 安装zabbix1:创建用户及组: groupadd zabbix useradd -g zabbix zabbix ...
- http协议
什么是协议 是指关于计算机通信的一整套规则,是为完成计算机网络通信而制订的规则.约定和标准. http协议是众多通信协议中的一种,超文本传输协议 (HTTP-Hypertext transfer pr ...
- Solr学习总结(八)IK 中文分词的配置和使用
最近,很多朋友问我solr 中文分词配置的问题,都不知道怎么配置,怎么使用,原以为很简单,没想到这么多朋友都有问题,所以今天就总结总结中文分词的配置吧. 有的时候,用户搜索的关键字,可能是一句话,不是 ...
- centos7安装svn1.8.16
svn下载地址:http://subversion.apache.org/download/ svn要依赖一些包,可以提前装好 yum -y install apr-util apr-util-dev ...
- C# 全角和半角转换以及判断的简单代码
在C#中判断和转换全角半角的方法 1. 判断是否为全角半角 全角占用二个字节 半角占用一个字节 用string.length 和System.text.Encoding.Default.GetByte ...
- 第4天--linux内核学习
驱动使用方式1.编译到内核中 * make uImage进入到系统后mknod /dev/led c 500 0 创建设备节点 2.编译为模块 M make module进入到系统后 mknod /d ...