文档章节

D3D编程必备的数学知识(5)

rise-worlds
 rise-worlds
发布于 2016/06/20 13:41
字数 1064
阅读 1
收藏 0

平面

D3DX平面

在代码中描述一个平面:仅仅需要一个法向量n和常数d就可以了。因此我们就使用一个4D向量(我们记录成(n, d))来实现它。D3DX库中用如下的结构来定义一个平面:

typedef struct D3DXPLANE
{
#ifdef __cplusplus
public:
D3DXPLANE() {}
D3DXPLANE( CONST FLOAT* );
D3DXPLANE( CONST D3DXFLOAT16* );
D3DXPLANE( FLOAT a, FLOAT b, FLOAT c, FLOAT d );

// casting
operator FLOAT* ();
operator CONST FLOAT* () const;

// unary operators
D3DXPLANE operator + () const;
D3DXPLANE operator - () const;

// binary operators
BOOL operator == ( CONST D3DXPLANE& ) const;
BOOL operator != ( CONST D3DXPLANE& ) const;
#endif //__cplusplus
FLOAT a, b, c, d;
} D3DXPLANE, *LPD3DXPLANE;

对照等式(8)可知:这里a, b和c是平面法向量n的成员,d就是那个常数。

点和平面的空间关系

我们判定点和平面的关系主要是利用等式(8)来实现。例如,假设平面(n, d),我们能判定点p和平面的关系

假如n·p + d = 0,那么点p与平面共面。

       假如n·p + d >0,那么点p在平面的前面且在平面的正半空间里。

       假如n·p + d <0,那么点p在平面的背面且在平面的负半空间里。

下边的D3DX函数就是利用n·p + d 来判定点和平面的关系的函数:

FLOAT D3DXPlaneDotCoord(

       CONST D3DXPLANE *pP, // 平面

       CONST D3DXVECTOR3 *pV // 点

);

// 测试点相对于平面的位置

D3DXPLANE p(0.0f, 1.0f, 0.0f, 0.0f);

D3DXVECTOR3 v(3.0f, 5.0f, 2.0f);

float x = D3DXPlaneDotCoord( &p, &v );

if( x approximately equals 0.0f ) // v在平面.上

if( x > 0 ) // v在正半空间

if( x < 0 ) // v在负半空间

创建平面

我们能通过两种方法创建平面。

第一种方法,直接用指定法线和点创建平面。假设法线n和在平面上的已知点p0,我们就能求出d:

n·p0+ d = 0

n·p0 = -d

-n·p0 = d

D3DX库提供如下函数来完成创建平面的任务:

D3DXPLANE *D3DXPlaneFromPointNormal(

       D3DXPLANE* pOut, // Result.

       CONST D3DXVECTOR3* pPoint, // Point on the plane.

       CONST D3DXVECTOR3* pNormal // The normal of the plane.

);

第二种方法我们能通过在平面上的3个点创立一个平面

假如有点p0, p1, p2,那么我们就能得到平面上的两个向量:

u = p1 - p0

v = p2 - p0

因此我们能通过把平面上的两个向量进行叉乘得到平面的法线。回忆左手坐标系。

n = u × v

Then, -(n · p0) = d.

D3DX库提供如下函数来完成通过同一平面上的3个点确定一个平面:

D3DXPLANE *D3DXPlaneFromPoints(

       D3DXPLANE* pOut, // Result.

       CONST D3DXVECTOR3* pV1, // Point 1 on the plane.

       CONST D3DXVECTOR3* pV2, // Point 2 on the plane.

       CONST D3DXVECTOR3* pV3 // Point 3 on the plane.

);

变换平面

我们能够通过如下处理来变换一个面(n, d),就象一个4D向量通过乘以它所期望的变换矩阵的逆矩阵一样来达到变换目的。注意平面的法向量必须首先被标准化。

我们能用下面的D3DX函数来完成操作:

D3DXPLANE *D3DXPlaneTransform(

       D3DXPLANE *pOut, // Result

       CONST D3DXPLANE *pP, // Input plane.

       CONST D3DXMATRIX *pM // Transformation matrix.

);

示例代码:

D3DXMATRIX T(...); // Init. T to a desired transformation.

D3DXMATRIX inverseOfT;

D3DXMATRIX inverseTransposeOfT;

D3DXMatrixInverse( &inverseOfT, 0, &T );

D3DXMatrixTranspose( &inverseTransposeOfT, &inverseOfT );

D3DXPLANE p(...); // Init. Plane.

D3DXPlaneNormalize( &p, &p ); // make sure normal is normalized.

D3DXPlaneTransform( &p, &p, &inverseTransposeOfT );

射线(可选的)

设想在游戏中的一个玩家,正用他的枪射击敌人。我们怎么判断子弹是否从一个位置击中另一个位置的目标?一个方法是用一条射线模拟子弹,用一个球体模型模拟敌人。(球体模型只是一个球体,它紧紧的围绕一个物体,从而粗略地表示它的大小。球体模型将在第11章中做更详细的介绍。)那么通过计算我们就能够判定是否射中球体。在这部分我们学习射线的数学模型。

射线

一条射线能用一个起点和方向来描述。射线的参数方程是:

线/面相交

假设一条射线p(t) = p0 + tu 和 一个平面n·p + d = 0,我们想知道射线是否与平面相交,以及相交的交点信息(如果相交的话)。照这样做,我们把射线代入平面方程并且求满足平面方程的参数t,解答出来的参数就是相交的点。

把等式(9)代入平面方程:

本文转载自:http://www.cnblogs.com/flying_bat/archive/2008/03/16/1108357.html

共有 人打赏支持
rise-worlds

rise-worlds

粉丝 2
博文 1755
码字总数 0
作品 0
深圳
程序员
私信 提问
盈趣上海众多游戏技术岗位火热招募中

职位一:C/C++客户端开发工程师 工作职责: 1.负责MTK平台游戏客户端主要模块的开发 2.负责游戏客户端与服务器端的交互 3.负责客户端代码的整合及优化 职位要求: 1. 1年以上MTK平台游戏开发...

yuer150
2011/04/26
366
3
盈趣信息技术上海有限公司众多技术岗位招募中

职位一:C/C++客户端开发工程师 工作职责: 1.负责MTK平台游戏客户端主要模块的开发 2.负责游戏客户端与服务器端的交互 3.负责客户端代码的整合及优化 职位要求: 1. 1年以上MTK平台游戏开发经验...

yuer150
2011/05/02
1K
0
机器学习中的数学:一份新鲜出炉的热门草稿

来源:机器之心; 本文约1500字,建议阅读5分钟。 本文为你分享近日《Mathematics for Machine Learning》的全部草稿已放出,我们整理了这本书的简要概述。 近日,Marc Peter Deisenroth、A...

数据分析v
2018/11/08
0
0
如何学好游戏3D引擎编程

注:本文是网上看到的一篇文章,感觉写的很好,因此收藏了下来 《如何学好游戏3D引擎编程》 此篇文章献给那些为了游戏编程不怕困难的热血青年,它的神秘要我永远不间断的去挑战自我,超越自我...

loving_forever_
2016/07/28
0
0
菜鸟程序员必备的5个编程网站,其中一个精品课程经15年改进!

你的计算机基础和编程素养决定了你的能力,以及未来的薪资匹配。 当你刚刚入门编程,为了打下扎实的编程基础,w3cschool给新手程序员推荐5个非常适合新手的编程网站: 0、Coursera.org Cour...

W3Cschool
2018/04/18
0
0

没有更多内容

加载失败,请刷新页面

加载更多

C++ vector和list的区别

1.vector数据结构 vector和数组类似,拥有一段连续的内存空间,并且起始地址不变。 因此能高效的进行随机存取,时间复杂度为o(1); 但因为内存空间是连续的,所以在进行插入和删除操作时,会造...

shzwork
46分钟前
2
0
Spring之invokeBeanFactoryPostProcessors详解

Spring的refresh的invokeBeanFactoryPostProcessors,就是调用所有注册的、原始的BeanFactoryPostProcessor。 相关源码 public static void invokeBeanFactoryPostProcessors(Configu......

cregu
昨天
3
0
ibmcom/db2express-c_docker官方使用文档

(DEPRECIATED) Please check DB2 Developer-C Edition for the replacement. What is IBM DB2 Express-C ? ``IBM DB2 Express-C``` is the no-charge community edition of DB2 server, a si......

BG2KNT
昨天
2
0
Ubuntu 18.04.2 LTS nvidia-docker2 : 依赖: docker-ce (= 5:18.09.0~3-0~ubuntu-bionic)

平台:Ubuntu 18.04.2 LTS nvidia-docker2 版本:2.0.3 错误描述:在安装nvidia-docker2的时候报dpkg依赖错误 nvidia-docker2 : 依赖: docker-ce (= 5:18.09.0~3-0~ubuntu-bionic) 先看一下依......

Pulsar-V
昨天
4
0
学习笔记1-goland结构体(struct)

写在前面:若有侵权,请发邮件by.su@qq.com告知。 转载者告知:如果本文被转载,但凡涉及到侵权相关事宜,转载者需负责。请知悉! 本文永久更新地址:https://my.oschina.net/bysu/blog/3036...

不最醉不龟归
昨天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部