DirectX中有两个很相似的函数,输入与输出的参数格式完全一样,都是输入一个三维向量(D3DXVECTOR3)和一个矩阵(D3DXMATRIX),输出变换之后的向量(D3DXVECTOR3)。

函数内部的工作机制也很类似,都是把三维向量扩充成四维向量,然后和矩阵相乘,得到变换之后的四维向量,再把四维向量转换成三维向量输出。

两者的区别在于开始把三维向量转换成四维向量时,第四维分量的取值。D3DXVec3TransformNormal( ) 用于矢量的变换,第四维分量为0。D3DXVec3TransformCoord( )  用于坐标的变换,第四维分量为1。

为什么要有这样的区别呢?

在三维坐标系中,虽然矢量和坐标都用(x,y,z)表示,但是坐标仅表示点在坐标系中的位置,没有方向和长度。三维变换中,坐标点可以平移。由于我们使用向量与矩阵的乘法来计算三维变换,而变换矩阵是4x4的矩阵,只能和四维行向量相乘,因此需要扩充第四维分量来实现三维变换的乘法计算,把第四维分量设置成1,可以保证平移变换的实现。

矢量表示的是一段有方向和长度的有向线段,两个坐标点之间的矢量可以用终点坐标减起点坐标来计算。在三维的表示方法中,两个三维向量相减,结果还是三维向量,即(Ax,Ay,Az)-(Bx,By,Bz)=(X,Y,Z)。如果扩充到四维表示,把坐标点的第四维分量设置成1,那么用减法计算矢量时,得到的四维向量的前三维分量和三维计算一致,但第四维等于0,即(Ax,Ay,Az,1)-(Bx,By,Bz,1)=(X,Y,Z,0)。矢量(x,y,z)一般表示成从原点(0,0,0)到坐标点(x,y,z)的有向线段,但是它可以任意的坐标点作为起点或终点,只要方向和长度保持一致。因此矢量没有特定的位置。四维表示时,由于第四维等于0,因此,矢量也就不可以实现平移变换。当然,没有位置本来也就不需要平移了。

所以,通过第四维的0,忽略平移变换,是矢量变换与坐标变换的根本区别。

但是矢量变换与坐标变换还是有关系的。可以验证一下,在对矢量进行三维变换时,可以先假设一个矢量的起点为原点(0,0,0),终点是(x,y,z),变换时先使用D3DXVec3TransformCoord( ) 变换起点,再使用D3DXVec3TransformCoord( ) 变换终点,然后再把变换后的终点与起点相减得到转换后的矢量值,这个减法一方面是计算矢量的值,另一方面也相当于忽略了平移变换,因为原点只会发生平移变换。因此,矢量变换的结果与原矢量终点坐标(x,y,z)变换之后的值是完全不一样的。

该结果与直接使用D3DXVec3TransformNormal( )一致。

代码片断:

D3DXVECTOR3 O(0,0,0);    //原点坐标
D3DXVECTOR3 S(x,y,z);    //矢量坐标
D3DXMATRIX M;

/**//* 设置变换矩阵M */

//变换矢量终点坐标
D3DXVec3TransformCoord(&S,&S,&M);    
//变换矢量起点坐标
D3DXVec3TransformCoord(&O,&O,&M);
//计算变换后的矢量
S=S-O;

转:D3DXVec3TransformNormal() 与 3DXVec3TransformCoord() 的区别的更多相关文章

  1. 【转载】D3DXVec3TransformNormal and D3DXVec3TransformCoord

    原文:D3DXVec3TransformNormal and D3DXVec3TransformCoord D3DXVec3TransformCoord 对向量进行变换,没啥好说明的,默认向量为行向量 ...

  2. c#与java的区别

    经常有人问这种问题,用了些时间java之后,发现这俩玩意除了一小部分壳子长的还有能稍微凑合上,基本上没什么相似之处,可以说也就是马甲层面上的相似吧,还是比较短的马甲... 一般C#多用于业务系统的开发 ...

  3. jquery和Js的区别和基础操作

    jqery的语法和js的语法一样,算是把js升级了一下,这两种语法可以一起使用,只不过是用jqery更加方便 一个页面想要使用jqery的话,先要引入一下jqery包,jqery包从网上下一个就可以, ...

  4. 【原】nodejs全局安装和本地安装的区别

    来微信支付有2年多了,从2年前的互联网模式转变为O2O模式,主要的场景是跟线下的商户去打交道,不像以往的互联网模式,有产品经理提需求,我们帮忙去解决问题. 转型后是这样的,团队成员更多需要去寻找业务的 ...

  5. 探究@property申明对象属性时copy与strong的区别

    一.问题来源 一直没有搞清楚NSString.NSArray.NSDictionary--属性描述关键字copy和strong的区别,看别人的项目中属性定义有的用copy,有的用strong.自己在开 ...

  6. X86和X86_64和X64有什么区别?

    x86是指intel的开发的一种32位指令集,从386开始时代开始的,一直沿用至今,是一种cisc指令集,所有intel早期的cpu,amd早期的cpu都支持这种指令集,ntel官方文档里面称为&qu ...

  7. Java中Comparable与Comparator的区别

    相同 Comparable和Comparator都是用来实现对象的比较.排序 要想对象比较.排序,都需要实现Comparable或Comparator接口 Comparable和Comparator都 ...

  8. MySQL中interactive_timeout和wait_timeout的区别

    在用mysql客户端对数据库进行操作时,打开终端窗口,如果一段时间没有操作,再次操作时,常常会报如下错误: ERROR (HY000): Lost connection to MySQL server ...

  9. 设置line-height:1.5和line-height:150%或者line-height:150px的区别

    直接正题: 看一下line-height可能的值: 其实可以分为两类: (1)不带单位的(如line-height:1.5),这种是推荐使用的: (2)带单位的(如line-heigth:30px/1 ...

随机推荐

  1. CentOS下httpd下php 连接mysql 本机可以,外网报错Could not connect: Can't connect to MySQL server on '127.0.0.1' (13)2003 原因解析

    php代码很简单: $server="127.0.0.1"; println("Begin"); $link = mysql_connect($server,& ...

  2. 数学图形(1.49)Nephroid曲线

    昨天IPhone6在国内发售了,我就顺手发布个关于肾的图形.Nephroid中文意思是肾形的.但是这种曲线它看上去却不像个肾,当你看到它时,你觉得它像什么就是什么吧. The name nephroi ...

  3. [leetcode]Subsets II @ Python

    原题地址:https://oj.leetcode.com/problems/subsets-ii/ 题意: Given a collection of integers that might cont ...

  4. Android -- MediaRecord

    MediaRecord 集成了录音.编码.压缩等,支持少量的录音音频格式,大概有.aac .amr .3gp 优点:大部分以及集成,直接调用相关接口即可,代码量小 缺点:无法实时处理音频:输出的音频格 ...

  5. 1 R语言介绍

    注释:# 赋值:<- 查看.设定当前工作目录:getwd()  setwd()   wd:workspace directory[setwd("c:/myproject/project ...

  6. Install Hyper-V on Windows 10

      Enable Hyper-V to create virtual machines on Windows 10.Hyper-V can be enabled in many ways includ ...

  7. tail 命令

    转自:http://www.cnblogs.com/peida/archive/2012/11/07/2758084.html tail 命令从指定点开始将文件写到标准输出.使用tail命令的-f选项 ...

  8. PYQT实现简单的浏览器功能

    主要的类 QMainWindow 提供一个有菜单条.锚接窗口(例如工具条)和一个状态条的主应用程序窗口. http://www.kuqin.com/qtdocument/qmainwindow.htm ...

  9. logback debug 日志没有信息

    可能是项目绑定的日志不是logback的jar包,而是其他包,具体可查看tomcat启动日志 log4j:WARN No appenders could be found for logger (or ...

  10. Eclipse远程连接Hadoop

    Windows下面调试程序比在Linux下面调试方便一些,于是用Windows下的Eclipse远程连接Hadoop. 1. 下载相应版本的hadoop-eclipse-plugin插件,复制到ecl ...