当前位置: 首页 > news >正文

DirectX3D 正交投影学习记录

所谓正交投影变换,就是已知盒状可视空间内任意点坐标(x,y,z),求解垂直投影到xy平面的对应点坐标。
按照这个定义,xyz坐标系本身就是正交坐标系,盒状可视空间内任意点的坐标(x,y,z)投影到(x,y)平面,只要简单地丢弃z坐标就可以啦,即(x,y,z)变换到(x,y,0)即可,这个理解完全没有问题,但却不是正确的结果,那么原因是什么呢?

主要原因是有两个需要考虑的问题:

规范化坐标系:现实情况几乎所有的图形系统都把坐标系的空间范围限定在(-1,1)范围内,这么做是为了方便移植,使坐标系独立于各种尺寸的图形设备。
z坐标需要保留:想象一下可视空间内存在多个物体的场景,前面的物体可能遮挡后面的物体导致无法被看见,绘制图像时需要利用z坐标来判断前后遮挡关系来觉得那个物体需要绘制,因此保留z坐标是最终图形呈现所必须的参数。

所以正交投影变化起始就是把选择的一个矩形区域缩放平移到标准位置和大小。
知乎这篇文章计算的应该是 opengl 的公式,opengl 的标准位置和大小是 [-1,1]^3。
在这里插入图片描述

directX3d 正交投影矩阵

directX3D 的标准位置是 xy 的范围是 [-1,1]^2,z的范围是[0,1],所以 directX3D 的正交投影公式是下面这个。
在这里插入图片描述

XMMatrixOrthographicLH 的计算公式和上面也是对应的(directX和oepngl的横纵也是反的,所以需要转置一下)
XMMatrixOrthographicLH 框起来的范围应该是x:(-viewWidth/2, viewWidth/2),y:(-viewHeight/2,viewHeight/2),z:(nearZ, farZ)float fRange = 1.0f / (FarZ - NearZ);XMMATRIX M;
M.m[0][0] = 2.0f / ViewWidth;
M.m[0][1] = 0.0f;
M.m[0][2] = 0.0f;
M.m[0][3] = 0.0f;M.m[1][0] = 0.0f;
M.m[1][1] = 2.0f / ViewHeight;
M.m[1][2] = 0.0f;
M.m[1][3] = 0.0f;M.m[2][0] = 0.0f;
M.m[2][1] = 0.0f;
M.m[2][2] = fRange;
M.m[2][3] = 0.0f;M.m[3][0] = 0.0f;
M.m[3][1] = 0.0f;
M.m[3][2] = -fRange * NearZ;
M.m[3][3] = 1.0f;
return M;

参考文献

https://zhuanlan.zhihu.com/p/473031788
https://blog.csdn.net/qq_31910239/article/details/118583533
https://blog.csdn.net/qq_20828983/article/details/82382573

http://www.lryc.cn/news/197922.html

相关文章:

  • 数据挖掘十大算法--Apriori算法
  • [蓝桥杯 2022 省 B] 统计子矩阵
  • 解决在部署springboot项目的docker中执行备份与之相连接的mysql容器命令
  • 正文Delphi XE Android下让TMemo不自动弹出键盘
  • [1Panel]开源,现代化,新一代的 Linux 服务器运维管理面板
  • PG集合查询
  • 目标检测应用场景和发展趋势
  • Confluence 自定义博文列表
  • chrome历史版本下载
  • Messari发布Moonbeam简报,每日交易量稳步增长,首次公布利润数据
  • 数据库 锁、索引、在实际开发中怎么设置和优化
  • 超详细彻底卸载Anaconda详细教程
  • Python--随机出拳(random)--if判断--综合案例练习:石头剪刀布
  • 微信小程序里配置less
  • MySq修改配置文件
  • HTML 表格及练习
  • YOLOv5-训练自己的VOC格式数据集(VOC、自建数据集)
  • 基于Java的考研信息查询系统设计与实现(源码+lw+部署文档+讲解等)
  • Linux性能优化--性能追踪:受CPU限制的应用程序(GIMP)
  • BERT变体(1):ALBERT、RoBERTa、ELECTRA、SpanBERT
  • 域控操作二:设置域用户使用简单密码
  • python---三目运算符
  • 百度地图定位BMap.GeolocationControl的用法
  • Vue3响应式原理初探
  • firewalld常用的基础配置
  • 功率放大器如何驱动超声波换能器
  • LiveGBS流媒体平台GB/T28181常见问题-安全控制HTTP接口鉴权勾选流地址鉴权后401Unauthorized如何播放调用接口
  • 红帽认证笔记2
  • 程序开发中表示密码时使用 password 还是 passcode?
  • html5 文字自动省略,html中把多余文字转化为省略号的实现方法方法