这一节介绍在Direct3d中观察变换的基本概念和怎么去设置观察矩阵。

视口变换把观察者放在世界坐标系中,并把顶点转化到摄像机空间。在摄像机空间,摄像机或者说观察者在原点,观察方向为z轴正向。Direct3d使用左手坐标系,所以z轴正向进入场景。观察矩阵把重新变换世界中的物品、摄像机位置、摄像机空间原点和方向。

有许多方法可以创建观察矩阵。摄像机在世界空间中的逻辑位置和方向被用作起始点来创建观察矩阵,得到观察矩阵会被应用于场景中的三维建模。观察矩阵平移和旋转在摄像机空间的模型,将他们放入摄像机空间中,摄像机在原点。创建观察矩阵的一种方法是在每个轴联合平移矩阵和旋转矩阵。这种方法用可以下面的矩阵等式来看

在这个公式中,V是要创建的观察矩阵,T是在世界中重定位物体的平移矩阵,Rx到Rz分别是绕x轴,y轴和z轴旋转物体的旋转矩阵。这个变换和旋转是根据摄像机的南位置和朝向的。所以如果摄像机在世界坐标(10,20,100),那么变换矩阵把模型在x轴移动-10,y轴移动-20,z轴移动-100。旋转矩阵根据公式和摄像机的朝向的关,根据摄像机空间轴与世界坐标系各轴夹角有关。例如,前面提到摄像机是垂直向下的,那么他的z轴与世界空间的z轴有90角夹角,如下图所示

旋转矩阵将角度相同但方向相反的旋转量应用于场景中建模。这个摄像机的观察矩阵包含了一个绕x轴90度的旋转。旋转矩阵与平移矩阵合并生成观察矩阵,观察矩阵调整物品在场景中的位置和方向,使他们的顶部朝着摄像机,看起一好像摄像机在建模的上方一样。

设置观察矩阵

D3DXMatrixLookAtLH和D3DXMatrixLookAtRH这些函数可以根据摄像机位置和观察方向创建一个矩阵。

下列实例创建一个观察矩阵应用于左手坐标系。

D3DXMATRIX out;
D3DXVECTOR3 eye(2,3,3);
D3DXVECTOR3 at(0,0,0);
D3DXVECTOR3 up(0,1,0);
D3DXMatrixLookAtLH(&out, &eye, &at, &up);

Direct3d使用世界变换矩阵和观察变换矩阵来计算内部的一些数据结构。每次你给定一个变换矩阵都会重新计算相关的内部数据结构 。频繁的设置这些矩阵,会比较比较耗时。通过将世界矩阵和观察矩阵串接成一个世界/观察矩阵,并将之设置为世界矩阵,然后将观察矩阵设为单位矩阵,应用程序可以将所需的计算量减到最小。最好保存一份单独的世界矩阵和观察矩阵的副本在高速缓存中,这样就可以根据需要修改、串接及重置世界矩阵。为清晰起见,Direct3D示例很少使用这项优化。

[翻译]观察变换View Transform (Direct3D 9)的更多相关文章

  1. View Transform(视图变换)详解

    http://www.cnblogs.com/graphics/archive/2012/07/12/2476413.html 什么是View Transform 我们可以用照相机的原理来阐释3D图形 ...

  2. (转)View Transform(视图变换)详解

    原文作者讲得太好了,唯有这篇让我对视图矩阵了解的清晰了很多. --------------------------------------------------------------------- ...

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

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

  4. [翻译]投影变换 Projection Transform (Direct3D 9)

    你可以认为投影变换就是控制摄像机内部的一种方式.他可以类推为为摄像机选择一个漏字板.它是三种变换中最难懂的.本文只讨论以下的一些内容. 典型的投影变换就是缩放和透视投影.投影就变换把视椎转化为一个立方 ...

  5. 理解SVG坐标系统和变换: transform属性

    SVG元素可以通过缩放,移动,倾斜和旋转来变换-类似HTML元素使用CSS transform来变换.然而,当涉及到坐标系时这些变换所产生的影响必然有一定差别.在这篇文章中我们讨论SVG的transf ...

  6. Pytorch数据变换(Transform)

    实例化数据库的时候,有一个可选的参数可以对数据进行转换,满足大多神经网络的要求输入固定尺寸的图片,因此要对原图进行Rescale或者Crop操作,然后返回的数据需要转换成Tensor如: import ...

  7. QT 使用QPainter 绘制图形 和 世界变换 world transform

    1. 绘制椭圆  饼状型 贝塞尔曲线 绘制图像重写方法 void paintEvent(QPaintEvent *event)即可. void Widget::paintEvent(QPaintEve ...

  8. CSS3总结七:变换(transform)

    2D视图模型解析 3D视图模型解析 平移 旋转 伸缩 扭曲 z轴方向平移与perspective的神秘关系 matrix()终极变幻的方法 一.2D视图 2D视图就是默认平面上的每个点都与视线垂直,图 ...

  9. 游戏对象的变换-Transform

    问题: 在给GameObject设置位置的时候,怎么保证设置的位置在摄像机的范围内?         主要看摄像机的深度轴和你的GameObject的深度轴,比如如果现在的平面是: Z–> Y, ...

随机推荐

  1. android 自定义view详解

    1.自定义View前首先要了解一下View的方法,虽然有些不一定要实现. 分类 方法 描述 创建 Constructors View中有两种类型的构造方法,一种是在代码中构建View,另一种是填充布局 ...

  2. OpenGL笔试题

    简述FrameBuffer,RenderBuffer,Depth Buffer,Framebuffer attachment,Stencil buffer的关系 简述利用OpenGL执行图像叠加(大P ...

  3. Linode 优惠码

    Linode 是最好的vps $10的优惠码 Linode10,推荐码:bc7852453e280eee5a8ef045c5ab54ca091c8021 链接https://www.linode.co ...

  4. sql基础查询

    2.1 指定使用中的资料库 一个资料库伺服器可以建立许多需要的资料库,所以在你执行任何资料库的操作前,通常要先指定使用的资料库.下列是指定资料库的指令: 如果你使用「MySQL Workbench」这 ...

  5. [翻译] 使用ASP.NET MVC操作过滤器记录日志

    [翻译] 使用ASP.NET MVC操作过滤器记录日志 原文地址:http://www.singingeels.com/Articles/Logging_with_ASPNET_MVC_Action_ ...

  6. javaWeb request乱码处理

    //解决get方式提交的乱码        String name = request.getParameter("name");        name=new String(u ...

  7. 【jqGrid for ASP.NET MVC Documentation】.学习笔记.6.分层

    1 两级分层 每个父 grid 的行,都能有子 grid .这被叫做 层次,它用来显示相关的 表,主信息 –> 明细信息等. } 一旦你为 父子 grid 都定义了 Models ,下一步就是设 ...

  8. linux string 操作

    http://www.cnblogs.com/chengmo/archive/2010/10/02/1841355.html 字符替换 sed -i 's/3306/3308/g' my.cnf my ...

  9. C#Winform常引用的库

    1.DevExpress:引用其下的不同DLL,可操作使用不同的控件 2.IrisSkin2:引用对应的DLL后,代码如下 private Sunisoft.IrisSkin.SkinEngine s ...

  10. PRINCE2七大原则(2)

    PRINCE2七大原则(2) 我们先来回顾一下,PRINCE2七大原则分别是持续的业务验证,经验学习,角色与责任,按阶段管理,例外管理,关注产品,剪裁. 第二个原则:吸取经验教训. PRINCE2要求 ...