相机变换与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 ...
随机推荐
- html5定位getLocation()
HTML5 Geolocation API 用于获得用户的地理位置. 如果用户不允许定位,那么用户信息是不可用的. 获取用户的位置:getCurrentPosition() 返回数据如下 返回用户当前 ...
- 图说C++对象模型:对象内存布局详解
0.前言 文章较长,而且内容相对来说比较枯燥,希望对C++对象的内存布局.虚表指针.虚基类指针等有深入了解的朋友可以慢慢看. 本文的结论都在VS2013上得到验证.不同的编译器在内存布局的细节上可能有 ...
- Map工具系列-08-map控件查看器
所有cs端工具集成了一个工具面板 -打开(IE) Map工具系列-01-Map代码生成工具说明 Map工具系列-02-数据迁移工具使用说明 Map工具系列-03-代码生成BySQl工具使用说明 Map ...
- MySQL、MongoDB、Redis数据库Docker镜像制作
MySQL.MongoDB.Redis数据库Docker镜像制作 在多台主机上进行数据库部署时,如果使用传统的MySQL的交互式的安装方式将会重复很多遍.如果做成镜像,那么我们只需要make once ...
- iOS中常用的宏定义
转自http://www.jianshu.com/p/be00c3f3cafd //字符串是否为空 #define kStringIsEmpty(str) ([str isKindOfClass:[N ...
- ubuntu下载工具uget和aria2
一直想在ubuntu下找到个和迅雷差不多的下载工具.在网上找到了. 这篇文章完全是抄袭整理网上的. 我的系统版本是ubuntu14.04. 1.安装uget和aria2 sudo apt-get in ...
- LinuxMint配置Git(图文教程)
1.生成秘钥(直接回车,秘钥存放路径看命令行信息) 2.打开秘钥,需要注意的是.ssh可能是隐藏的,这时需要Ctrl+H显示隐藏文件夹 3.复制秘钥,添加到GitHub(Settings), 4.添加 ...
- setTimeout 和 throttle 那些事儿
document.querySelector('#settimeout').onclick= function () { setTimeout(function () { console.log('t ...
- Linux下如何查找.sh后缀的文件
find / -name *.sh或locate *.shfind 与locate的区别:locate 配合数据库查看文件位置 find 实际搜寻硬盘查询文件名称
- nandflash的读写(2440)
说明: 根据物理结构上的区别 , NandFlash主要分为如下两类:1)•SLC (Single Level Cell): 单层式存储2)•MLC (Multi Level Cell): 多层式存储 ...