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的更多相关文章

  1. 体绘制(Volume Rendering)概述之4:光线投射算法(Ray Casting)实现流程和代码(基于CPU的实现)

    转自:http://blog.csdn.net/liu_lin_xm/article/details/4850630 摘抄“GPU Programming And Cg Language Primer ...

  2. 体绘制(Volume Rendering)概述之3:光线投射算法(Ray Casting)原理和注意要点(强烈推荐呀,讲的很好)

    转自:http://blog.csdn.net/liu_lin_xm/article/details/4850609 摘抄“GPU Programming And Cg Language Primer ...

  3. OpenGL变换

    概述 OpenGL变换矩阵 实例:GL_MODELVIEW矩阵 实例:GL_PROJECTION矩阵 概述 OpenGL管线中,在光栅化操作之前,包括顶点位置与法线向量的几何数据经顶点操作与图元装配操 ...

  4. 【Android Developers Training】 65. 应用投影和相机视图

    注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...

  5. Android OpenGL ES 开发(五): OpenGL ES 使用投影和相机视图

    OpenGL ES环境允许你以更接近于你眼睛看到的物理对象的方式来显示你绘制的对象.物理查看的模拟是通过对你所绘制的对象的坐标进行数学变换完成的: Projection - 这个变换是基于他们所显示的 ...

  6. 透视投影(Perspective Projection)变换推导

    透视投影是3D固定流水线的重要组成部分,是将相机空间中的点从视锥体(frustum)变换到规则观察体(Canonical View Volume)中,待裁剪完毕后进行透视除法的行为.在算法中它是通过透 ...

  7. OpenGL变换【转】

    http://www.cnblogs.com/hefee/p/3811099.html OpenGL变换 概述 OpenGL变换矩阵 实例:GL_MODELVIEW矩阵 实例:GL_PROJECTIO ...

  8. 基本3D变换之World Transform, View Transform and Projection Transform

    作者:i_dovelemon 来源:CSDN 日期:2014 / 9 / 28 主题:World Transform, View Transform , Projection Transform 引言 ...

  9. (转)使用OpenGL显示图像(四)运用投影与相机视角

    运用投影与相机视角 编写:jdneo - 原文:http://developer.android.com/training/graphics/opengl/projection.html 在OpenG ...

随机推荐

  1. Http client 请求

    public String sendPost(String url, String param) { System.out.println("------------------ 1&quo ...

  2. css学习笔记(1)

    为什么要重新学css,理由有很多,css这个小婊砸,接触至今已有三年,但真的说熟练恐怕不见得.特此,为了我的目标,开始重新整理css的知识,我希望,每一篇笔记都能有个例子,从而来巩固我的知识. 在学习 ...

  3. UOJ58 【WC2013】糖果公园

    本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...

  4. python笔记1-转义字符

    print(r'dd"e"f')print(r'dd'e'f')print(r"dd"e"f")print(r"dd'e'f&qu ...

  5. Mysql 查看、创建、更改 数据库和表

    一.一探究竟 我想看看有多少个数据库,有多少个表,以及表里有啥东西.那么你可以这样: 图形界面: 命令: 查看多少个数据库:注意 后面带s #查看 SHOW DATABASES; #查看表 USE b ...

  6. MongoDB笔记

    mongodb简介 MongoDB 是一个基于分布式文件存储的数据库.存储的是Bson结构的文档(二进制的JSON),内部执行引擎为JS解释器,把文档存储为BSON结构,在查询时,转换为JS对象,可以 ...

  7. web api9

  8. yum---Linux软件安装与管理

    查询: yum list #查询所有可用的软件包列表 yum search keywords #搜索服务器上所有和关键字相关的软件包 安装: yum -y install 包名 options: in ...

  9. ruby 基础知识(二)

    ruby  中的动态方法 http://singleant.iteye.com/blog/1680382 Rails 大量使用了符号(symbol).符号看上去很像变量名,不过以冒号作为前缀.符号的例 ...

  10. beaglebone black 烧写系统后释放空间。

    执行 ./opt/script/toolsgrow_partition.sh就能将2g的空间变为sd卡的大小,我的是8g,执行后就是7.7g