`
li379395535
  • 浏览: 2207 次
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

Direct3D 顶点投影

阅读更多

原文地址:
http://www.cppblog.com/lovedday/archive/2008/05/02/48632.html

投影变换

将摄影空间中的三维物体投影到二维胶片上,也就是Direct3D中的屏幕,这种三维到二维的变换过程就是投影变换,即从取景空间到摄影空间的变换。设三维物体在观察空间中的坐标为 Pview ,投影矩阵为 Mproj ,则顶点在投影空间中的坐标为:

Pproj  = Pview  * Mproj

下面分别介绍两种基本的投影变换:正交投影和透视投影,以及它们在Direct3D中的实现。



1、正交投影

正交投影中,投影向量和观察平面垂直,物体坐标沿观察坐标系的z轴平行投影到观察平面上,观察点和观察平面间的距离不会影响物体的投影大小。

工程设计中的顶视图、前视图和侧视图就是典型的正交投影。与世界变换、取景变换类似,只需先生成一个投影矩阵mat_proj,然后调用下面的代码就可以设置投影矩阵:

g_device->SetTransform(D3DTS_PROJECTION, &mat_proj);

下面来看看正交投影矩阵的生成。对于正交投影来说,它的取景范围是一个长方体,只有在这个长方体中的景物才会被绘制出来。

Direct3D扩展实用库提供了函数D3DXMatrixOrthoLH(),用于创建一个正交投影矩阵,函数D3DXMatrixOrthoLH()的声明如下:

Builds a left-handed orthographic projection matrix.

D3DXMATRIX * D3DXMatrixOrthoLH(
  D3DXMATRIX * pOut,
  FLOAT w,
  FLOAT h,
  FLOAT zn,
  FLOAT zf
);

Parameters

pOut
    [in, out] Pointer to the resulting D3DXMATRIX.
w
    [in] Width of the view volume.
h
    [in] Height of the view volume.
zn
    [in] Minimum z-value of the view volume which is referred to as z-near.
zf
    [in] Maximum z-value of the view volume which is referred to as z-far.

Return Values

Pointer to the resulting D3DXMATRIX.
Remarks

All the parameters of the D3DXMatrixOrthoLH function are distances in camera space. The parameters describe the dimensions of the view volume.

The return value for this function is the same value returned in the pOut parameter. In this way, the D3DXMatrixOrthoLH function can be used as a parameter for another function.

This function uses the following formula to compute the returned matrix.

2/w  0    0           0
0    2/h  0           0
0    0    1/(zf-zn)   0
0    0   -zn/(zf-zn)  1



2、透视投影

透视投影实现的是一个缩放、透视的投影。透视投影的特点是,距离摄像机越远的物体在投影平面上的成像越小,透视投影的取景范围是一个截头体(四棱台)。这个截头体称为取景截头体(viewing frustum),摄像机位于四棱锥的顶点。这个四棱锥被截头体的远平面和近平面分割,远近裁剪面中间的部分就是取景截头体,只有这个空间里的对象才是可见的。

透视投影矩阵的作用就是将取景截头体内的景物投影到摄像机的二维胶片上,可以利用Direct3D功能扩展库提供的D3DXMatrixPerspectiveFovLH(),构建一个透视投影矩阵:

Builds a left-handed perspective projection matrix based on a field of view.

D3DXMATRIX * D3DXMatrixPerspectiveFovLH(
  D3DXMATRIX * pOut,
  FLOAT fovy,
  FLOAT Aspect,
  FLOAT zn,
  FLOAT zf
);

Parameters

pOut
    [in, out] Pointer to the D3DXMATRIX structure that is the result of the operation.
fovy
    [in] Field of view in the y direction, in radians.
Aspect
    [in] Aspect ratio, defined as view space width divided by height.
zn
    [in] Z-value of the near view-plane.
zf
    [in] Z-value of the far view-plane.

Return Values

Pointer to a D3DXMATRIX structure that is a left-handed perspective projection matrix.
Remarks

The return value for this function is the same value returned in the pOut parameter. In this way, the D3DXMatrixPerspectiveFovLH function can be used as a parameter for another function.

This function computes the returned matrix as shown:

xScale     0          0               0
0        yScale       0               0
0          0       zf/(zf-zn)         1
0          0       -zn*zf/(zf-zn)     0
where:
yScale = cot(fovY/2)

xScale = yScale / aspect ratio

透视投影矩阵的作用是将一个取景截头体转换成一个立方体。因为截头体的近端比远端小,所以靠近摄像机的对象将被放大,而对象距离摄像机越远,其成像越小,这就是场景的透视原理。透视变换把一个取景截头体转换成一个新的坐标空间,注意,该截头体变成了一个立方体,同时,原点从场景的右上角移动到了立方体的中心。在透视变换中,x轴和z轴方向的极限都是-1和1,z轴方向对于前平面的极限是0,对后平面的极限是1。

另外,D3DX还提供了下列函数供程序员创建透视投影变换矩阵:
D3DXMatrixPerspectiveLH

Builds a left-handed perspective projection matrix

D3DXMATRIX * D3DXMatrixPerspectiveLH(
  D3DXMATRIX * pOut,
  FLOAT w,
  FLOAT h,
  FLOAT zn,
  FLOAT zf
);

Parameters

pOut
    [in, out] Pointer to the D3DXMATRIX structure that is the result of the operation.
w
    [in] Width of the view volume at the near view-plane.
h
    [in] Height of the view volume at the near view-plane.
zn
    [in] Z-value of the near view-plane.
zf
    [in] Z-value of the far view-plane.

Return Values

Pointer to a D3DXMATRIX structure that is a left-handed perspective projection matrix.
Remarks

All the parameters of the D3DXMatrixPerspectiveLH function are distances in camera space. The parameters describe the dimensions of the view volume.

The return value for this function is the same value returned in the pOut parameter. In this way, the D3DXMatrixPerspectiveLH function can be used as a parameter for another function.

This function uses the following formula to compute the returned matrix.

2*zn/w  0       0              0
0       2*zn/h  0              0
0       0       zf/(zf-zn)     1
0       0       zn*zf/(zn-zf)  0



D3DXMatrixPerspectiveRH

Builds a right-handed perspective projection matrix.

D3DXMATRIX * D3DXMatrixPerspectiveRH(
  D3DXMATRIX * pOut,
  FLOAT w,
  FLOAT h,
  FLOAT zn,
  FLOAT zf
);

Parameters

pOut
    [in, out] Pointer to the D3DXMATRIX structure that is the result of the operation.
w
    [in] Width of the view volume at the near view-plane.
h
    [in] Height of the view volume at the near view-plane.
zn
    [in] Z-value of the near view-plane.
zf
    [in] Z-value of the far view-plane.

Return Values

Pointer to a D3DXMATRIX structure that is a right-handed perspective projection matrix.
Remarks

All the parameters of the D3DXMatrixPerspectiveRH function are distances in camera space. The parameters describe the dimensions of the view volume.

The return value for this function is the same value returned in the pOut parameter. In this way, the D3DXMatrixPerspectiveRH function can be used as a parameter for another function.

This function uses the following formula to compute the returned matrix.

2*zn/w  0       0              0
0       2*zn/h  0              0
0       0       zf/(zn-zf)    -1
0       0       zn*zf/(zn-zf)  0


D3DXMatrixPerspectiveFovRH

Builds a right-handed perspective projection matrix based on a field of view.

D3DXMATRIX * D3DXMatrixPerspectiveFovRH(
  D3DXMATRIX * pOut,
  FLOAT fovy,
  FLOAT Aspect,
  FLOAT zn,
  FLOAT zf
);

Parameters

pOut
    [in, out] Pointer to the D3DXMATRIX structure that is the result of the operation.
fovy
    [in] Field of view in the y direction, in radians.
Aspect
    [in] Aspect ratio, defined as view space width divided by height.
zn
    [in] Z-value of the near view-plane.
zf
    [in] Z-value of the far view-plane.

Return Values

Pointer to a D3DXMATRIX structure that is a right-handed perspective projection matrix.
Remarks

The return value for this function is the same value returned in the pOut parameter. In this way, the D3DXMatrixPerspectiveFovRH function can be used as a parameter for another function.

This function computes the returned matrix as shown.

xScale     0          0              0
0        yScale       0              0
0        0        zf/(zn-zf)        -1
0        0        zn*zf/(zn-zf)      0
where:
yScale = cot(fovY/2)
   
xScale = yScale / aspect ratio


D3DXMatrixPerspectiveOffCenterLH

Builds a customized, left-handed perspective projection matrix.

D3DXMATRIX * D3DXMatrixPerspectiveOffCenterLH(
  D3DXMATRIX * pOut,
  FLOAT l,
  FLOAT r,
  FLOAT b,
  FLOAT t,
  FLOAT zn,
  FLOAT zf
);

Parameters

pOut
    [in, out] Pointer to the D3DXMATRIX structure that is the result of the operation.
l
    [in] Minimum x-value of the view volume.
r
    [in] Maximum x-value of the view volume.
b
    [in] Minimum y-value of the view volume.
t
    [in] Maximum y-value of the view volume.
zn
    [in] Minimum z-value of the view volume.
zf
    [in] Maximum z-value of the view volume.

Return Values

Pointer to a D3DXMATRIX structure that is a customized, left-handed perspective projection matrix.
Remarks

All the parameters of the D3DXMatrixPerspectiveOffCenterLH function are distances in camera space. The parameters describe the dimensions of the view volume.

The return value for this function is the same value returned in the pOut parameter. In this way, the D3DXMatrixPerspectiveOffCenterLH function can be used as a parameter for another function.

This function uses the following formula to compute the returned matrix.

2*zn/(r-l)   0            0              0
0            2*zn/(t-b)   0              0
(l+r)/(l-r)  (t+b)/(b-t)  zf/(zf-zn)     1
0            0            zn*zf/(zn-zf)  0

D3DXMatrixPerspectiveOffCenterRH

Builds a customized, right-handed perspective projection matrix.

D3DXMATRIX * D3DXMatrixPerspectiveOffCenterRH(
  D3DXMATRIX * pOut,
  FLOAT l,
  FLOAT r,
  FLOAT b,
  FLOAT t,
  FLOAT zn,
  FLOAT zf
);

Parameters

pOut
    [in, out] Pointer to the D3DXMATRIX structure that is the result of the operation.
l
    [in] Minimum x-value of the view volume.
r
    [in] Maximum x-value of the view volume.
b
    [in] Minimum y-value of the view volume.
t
    [in] Maximum y-value of the view volume.
zn
    [in] Minimum z-value of the view volume.
zf
    [in] Maximum z-value of the view volume.

Return Values

Pointer to a D3DXMATRIX structure that is a customized, right-handed perspective projection matrix.
Remarks

All the parameters of the D3DXMatrixPerspectiveOffCenterRH function are distances in camera space. The parameters describe the dimensions of the view volume.

The return value for this function is the same value returned in the pOut parameter. In this way, the D3DXMatrixPerspectiveOffCenterRH function can be used as a parameter for another function.

This function uses the following formula to compute the returned matrix.

2*zn/(r-l)   0            0                0
0            2*zn/(t-b)   0                0
(l+r)/(r-l)  (t+b)/(t-b)  zf/(zn-zf)      -1
0            0            zn*zf/(zn-zf)    0

3、w友好投影矩阵

经过顶点坐标变换后,每个顶点坐标将具有4个元素(x, y, z, w)。Direct3D使用这个w坐标在深度缓冲区和雾化效果中执行一些深度相关的运算。为了能够使用这个w坐标进行深度相关运算,要求投影矩阵必须是w友好投影矩阵(w-friendly projection matrix,也称作兼容矩阵),即投影矩阵第三行第四列的元素必须是1,以使w坐标与世界空间中顶点的z坐标相当。如果投影变换矩阵第三行第四列的元素不是1,必须将所有的矩阵元素除以投影矩阵第三行第四列元素的值,将投影矩阵变换为w友好投影矩阵。如果没有提供一个w友好投影矩阵,基于深度的雾化效果和深度缓冲就不能正确实现。

下面给出的就是从一个非w友好投影矩阵到w友好投影矩阵的转换。

Direct3D在进行以w为基础的深度计算中,需要使用w友好投影矩阵,因此即使应用程序不需要进行顶点坐标变换,也需要设置一个w友好投影矩阵。通过实用库函数D3DXMatrixPerspectiveFovLH()得到的投影矩阵通常都是w友好投影矩阵,所以通常不需要关心这个问题。

 

分享到:
评论

相关推荐

    精通Direct3D图形与动画程序设计 04_第四章 顶点坐标变换.rar

    在Direct3D图形与动画程序设计中,顶点坐标变换是构建三维场景和实现动态效果的关键环节。本章深入探讨了这一主题,旨在帮助开发者掌握如何有效地操纵和转换顶点来创建复杂的3D模型和流畅的动画效果。以下是关于这个...

    c# direct3D教程

    3. 着色器:Direct3D支持多种着色器,如顶点着色器、像素着色器、几何着色器等,用于计算光照、纹理映射等效果。 4. 交换链:控制帧缓冲的交换,实现屏幕的刷新。 四、3D渲染流程 1. 设置视口和投影:定义3D空间到...

    Direct3D Primer 5

    Direct3D Primer 5 是一本深入讲解Direct3D图形编程的入门书籍,它涵盖了Direct3D的基础知识,以及如何利用Direct3D进行3D游戏和应用程序的开发。这本书的电子版包含了详细的理论介绍和配套的源代码示例,旨在帮助...

    Direct3D学习资源

    2. **渲染管线**:Direct3D的渲染管线是一个流程化的过程,包括顶点处理、几何处理、光栅化和像素处理阶段。理解每个阶段的作用,以及如何通过编程控制这些阶段,对于优化性能至关重要。 3. **顶点和索引缓冲**:...

    Direct3D技术内幕

    2. **3D图形管线**:详细解析3D图形的流水线工作流程,包括顶点处理、几何变换、裁剪、投影、屏幕空间光栅化以及像素处理等阶段。 3. **顶点缓冲和索引缓冲**:介绍如何使用顶点数据构建3D模型,以及如何通过索引...

    Beginning Direct3D Game Programming

    同时,你还将学习如何使用视图、投影和世界变换矩阵,将3D空间中的物体正确地投射到2D屏幕上。 纹理映射是3D图形中的一个重要概念,本书也会对其进行详尽的阐述。通过纹理,你可以给3D模型增添细节和真实感。学习...

    Direct3D中的2D编程 源码

    在这个源码集中,你可能会看到如何设置和管理设备,如何创建和应用投影矩阵,如何处理顶点缓冲和纹理,以及如何利用Direct3D的管线进行2D渲染。通过研究这些代码,你可以深入理解Direct3D的工作原理,并学习到如何...

    Direct3D 学习范例

    Direct3D是微软开发的一种图形应用程序接口(API),主要用于创建高性能的2D和3D图形。这个"Direct3D 学习范例"是基于Visual Studio 2010的一个项目,它展示了如何利用Direct3D来模拟太阳、月亮和地球的运动,这涉及...

    学习Direct3D中的2D

    总结来说,学习Direct3D中的2D图形涉及理解坐标系统、顶点、纹理、渲染状态、视口和投影,以及如何组合这些元素来创建和渲染2D图形。通过实践和不断探索,你可以掌握Direct3D的2D图形编程,为游戏或其他图形应用开发...

    Direct3D教程c#版

    6. **视口和投影**:视口和投影矩阵是将3D空间中的物体转换到2D屏幕的关键步骤,教程会解释如何设置视口和投影,以便正确显示场景。 7. **状态管理**:Direct3D中有各种各样的状态设置,如深度测试、混合模式和裁剪...

    Direct3D游戏开发入门教程(附源代码)

    教程可能从安装DirectX SDK和设置开发环境开始,然后逐步介绍Direct3D的核心概念,如设备创建、顶点缓冲区、索引缓冲区、视口和投影设置,以及深度缓冲和剔除。 在顶点缓冲区部分,你将学习如何定义和存储3D模型的...

    Direct3D游戏开发入门教程

    4. **顶点和索引缓冲区**:学习如何使用Direct3D管理顶点数据,通过顶点缓冲区和索引缓冲区有效地提交数据到GPU进行渲染。 5. **视图和投影变换**:理解视图空间和投影空间的概念,学习如何使用矩阵进行坐标变换,...

    Direct3D教程[程序源代码]

    8. **视口和投影**:视口定义了屏幕上的渲染区域,而投影则决定了3D空间如何被二维化。`SetViewport()`和`SetTransform()`函数分别用于设置这两个属性。 9. **帧循环**:在游戏或应用中,通常会有一个帧循环来处理...

    Direct3D示例

    2. **顶点缓冲区**:Direct3D使用顶点缓冲区来存储图形的几何数据,如位置、颜色、纹理坐标等。开发者需要理解如何定义顶点结构并将其上传到显存。 3. **状态设置**:Direct3D允许开发者设置各种渲染状态,如深度...

    9[1].0feiji.rar_3D 游戏_Direct3D_direct3d游戏_飞机游戏

    具体来说,开发者可能利用了Direct3D的顶点缓冲区来存储和操作3D模型的几何数据,使用纹理贴图技术来增加场景的真实感,同时借助光照模型来模拟真实世界中的光照效果,使游戏世界更加生动逼真。 在学习Direct3D的...

    Direct3D拾取物体例子代码

    需要注意的是,代码可能涉及到一些Direct3D的基础知识,如设备创建、纹理处理、顶点缓冲等,如果对此不熟悉,建议先学习Direct3D的基础教程。 总的来说,这个示例代码是一个宝贵的教育资源,通过它,你可以深入理解...

    direct3d 游戏入门教程(第二版)光盘中的代码

    Direct3D是微软开发的一个图形应用程序接口(API),主要用于创建高性能的2D和3D图形,尤其是在游戏开发领域。在“Direct3D 游戏入门教程(第二版)光盘中的代码”中,我们主要会涉及到第5章的内容。这个章节通常会...

    Direct3D 游戏编程入门教程(第二版)源代码

    这个压缩包中的“Direct3D 游戏编程入门教程(第二版)源代码”提供了学习Direct3D编程的实践材料,帮助初学者通过实际操作来理解Direct3D的工作原理。 1. **Direct3D基础**: - **设备创建**:在Direct3D中,首先...

    《Practical Rendering and Computation with Direct3D11》

    《Practical Rendering and Computation with Direct3D11》是一本深入探讨Direct3D 11编程技术的专业书籍。Direct3D是微软开发的一个图形应用程序接口(API),主要用于Windows平台上的游戏开发、科学可视化和专业...

    direct3D自学文档

    2. **投影和视口变换**:了解如何将3D坐标转换为2D屏幕坐标,这涉及到透视投影和平行投影的区别,以及视口变换的过程。 3. **坐标系统**:理解世界坐标、视图坐标和设备坐标之间的关系,这是正确进行3D渲染的关键。...

Global site tag (gtag.js) - Google Analytics