郁金香外挂技术-郁金香灬老师

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

郁金香终身VIP管理员QQ150330575项目合作(有实力的+)视频教程+每月更新+QQ群
飞郁视频分享(每周更新)
查看: 5181|回复: 0

D3D坐标系统下3D世界坐标映射到2D屏幕坐标的平移矩阵,(转)

[复制链接]
发表于 2018-12-25 16:27:32 | 显示全部楼层 |阅读模式

D3D中绘画3D模型基本上就是靠3个矩阵World, View, Projection来联合进行模型位置定位、视角定位及透视变形的,这与2D绘制一个图形只需要给出屏幕上的一个像素坐标就能进行定位有着非常大的不同。在某些场合,我们想根据屏幕上的像素坐标来绘制3D模型,一般可以通过用正交投影代替透视投影就能轻松进行绘制,但在一些极其特殊的情况下我们还想让绘制出的3D模型保持原先指定的3个矩阵所有变换,这就需要通过这3个矩阵及目标像素点反求出一个平移矩阵,这篇文章就是介绍该怎么做的。
先简单介绍一下在D3D里3D空间坐标在不做任何变化情况下是怎么转换成2D屏幕坐标。D3D的空间坐标在3个轴范围是[-1,1],D3D绘画到2D屏幕上的区域叫做ViewPort,ViewPort的横坐标范围是[Left, Right],纵坐标范围是[Top, Bottom],ViewPort还有近点(near)和远点(far)2个值代表z轴,则D3D空间坐标里的一点sp(x,y,z)的x坐标Xsp对应到屏幕上坐标sc(x,y)的x坐标Xsc的对应公式就是(这个详细解释网上有,这里不再赘述):
Xsc−LeftRight−Left =Xsp−(−1)1−(−1)   \dfrac{Xsc−Left}{Right−Left}=\dfrac{Xsp−(−1)}{1−(−1)}
让Width = Right - Left,上面公式最后就变成:
Xsc=(Xsp+1)∗Width2+Left
同样得出y轴:
Ysc=(Ysp+1)∗Height2+Top
z轴(虽然屏幕上是没有z坐标的,但这里给出是为了后面推导的时候能统一处理):
Zsc=Zsp∗(far−near)+near

接下来简单说一下齐次坐标,D3D系统里用得坐标并不只是(x,y,z),而是用4维坐标(x,y,z,w)来表示,这里齐次坐标与3维坐标的转换关系为:
⎡ ⎣ ⎢ ⎢ ⎢ xyzw ⎤ ⎦ ⎥ ⎥ ⎥ =⎡ ⎣ ⎢ ⎢ ⎢ ⎢ x/wy/wz/w1 ⎤ ⎦ ⎥ ⎥ ⎥ ⎥   \left[\begin{array} {c} x \\ y \\ z \\ w \end{array} \right] = \left[ \begin{array} {c} x/w \\ y/w \\ z/w \\ 1 \end{array} \right]

也就是齐次坐标的每一项都除以w,这个过程叫做齐次坐标归一化(Normalize)也可以叫标准化,得到的坐标就是归一化坐标,当然要注意一点是当齐次坐标表示向量的时w=0,这时候则不用去除w,向量就代表了坐标,也就是当w=0时不用做任何处理。最后简单讲一下w的作用,w从绘画结果来看实质上就是一个非线性变形,透视投影就是利用了w来进行变换的。
齐次坐标是通过一个归一化3维坐标与变换矩阵相乘得到的,因为D3D是左手坐标系,是用变换矩阵左乘坐标,变换矩阵为4x4矩阵:
⎡ ⎣ ⎢ ⎢ ⎢ xyz1 ⎤ ⎦ ⎥ ⎥ ⎥ ∗⎡ ⎣ ⎢ ⎢ ⎢ M11M12M13M14 M21M22M23
以上是D3D坐标系统下3D世界坐标映射到2D屏幕坐标的平移矩阵的全部内容,在云栖社区的博客、问答、公众号、人物、课程等栏目也有D3D坐标系统下3D世界坐标映射到2D屏幕坐标的平移矩阵 的相关内容,欢迎继续使用右上角搜索按钮进行搜索matrix , d3d , ar SharpDX ,以便于您获取更多的相关知识。

郁金香外挂教程,学习中...
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

限时限量优惠

QQ|小黑屋|手机版|郁金香外挂技术-郁金香灬老师 ( 苏ICP备10059359号 )

GMT+8, 2021-4-12 23:20 , Processed in 0.082701 second(s), 18 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表