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. jQuery实现二级菜单

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...

  2. oracleXE(oracle学习版)在windows的安装配置

    oracleXE其实安装基本就是一路下一步. 在安装前记得先把tomcat打开,不然oracleXE会占用8080端口且安装过程无法更改端口. 如果需要远程连接此oracle XE的话,要关闭这台电脑 ...

  3. theano scan optimization

    selected from Theano Doc Optimizing Scan performance Minimizing Scan Usage performan as much of the ...

  4. SVN 错误 Access to SVN Repository Forbidden的原因及解决方法

    原创文章,转载请注明出处:http://www.cnblogs.com/baipengzhan/p/SVN_Access_to_SVN_Repository_Forbidden.html   当我们新 ...

  5. Summary - SNMP Tutorial

    30.13 Summary Network management protocols allow a manager to monitor and control routers and hosts. ...

  6. 耗电—Android

    Android应用耗电分析与优化 http://sanwen8.cn/p/297Ut7b.html http://www.cnblogs.com/kobe8/p/3819305.html 有效控制An ...

  7. DEDEcms 在php5.4以上 后台登录空白解决办法

    本次环境php5.5 首先确定 dede data文件夹已经有写入权限 775 777都可以 然后再远程桌面或者FTP修改 include/userlogin.class.php 文件 注释掉下面六句 ...

  8. 多Form界面控件状态变化问题分析

    假定有frmA,frmB,frmC三个界面,当frmA中触发显示frmC与frmB触发显示frmC时显示界面不同,或者让frmC上的某个按钮不可用,此时应该在如何来控制frmC的显示.是采用在frmC ...

  9. 认识Android Service

    一.使用Service 1.什么是Service以及Service的配置项:  Service是Android组件的一种,派生自android.app.service类.它不提供交互界面,只是在后台运 ...

  10. 最新 Eclipse IDE下的Spring框架配置及简单实例

    前段时间开始着手学习Spring框架,又是买书又是看视频找教程的,可是鲜有介绍如何配置Spring+Eclipse的方法,现在将我的成功经验分享给大家. 本文的一些源代码来源于码农教程:http:// ...