计算机图形学基础

计算机图形学最基础的目标就是把建模时构建好的3D物体显示在2D屏幕上,这就涉及到物体在不同坐标系中坐标的转换。(物体/建模坐标系 ---------> 屏幕坐标系)

坐标系

在游戏中涉及到各种坐标空间和对应的坐标系

游戏中通过建模完成的3D物体要想在2D屏幕上显示出来需要进行坐标的转换。

矩阵变换

物体在一个三维坐标系中要想变换到另一个三维坐标系中需要通过矩阵乘法(与一个特殊的矩阵相乘),得到在另一个三维坐标系中的坐标。三维空间中某点的变换可以表示成点的齐次坐标与四阶的三维变换矩阵相乘 。

D3D和OpenGL的矩阵存储

D3D中会将对应的线代矩阵利用数组按行存储(行主顺),OpenGL中会按列存储(列主序)。

FPS游戏逆向思路

我们利用CE附加游戏后我们可以找到人物在世界坐标中的世界坐标(x1,y1,z1),要想在屏幕上画出人物边框就需要将世界坐标转化为屏幕坐标。

世界坐标 ----> 裁剪坐标

因为世界坐标通过乘观察矩阵得到观察坐标,观察坐标在乘裁剪矩阵得到裁剪坐标。而且观察矩阵和裁剪矩阵都会进行归一化,也就是我们可以找到观察矩阵和裁剪矩阵组成的组合矩阵,而且此4x4的组合矩阵会进行归一化(第一个元素为(-1,1))。

X = a11*x1 + a12*y1 + a13*z1 + a14

Y = a21*x1 + a22*y1 + a23*z1 + a24

Z = a31*x1 + a32*y1 + a33*z1 + a34

W = a41*x1 + a42*y1 + a43*z1 + a44

//(x, y, z)就是(x1,y1,z1)对应的裁剪坐标
//注意w有可能小于0,如果w小于说明物体不在你的视角范围中(不需要在屏幕上显示)。

所以我们需要的就是通过组合矩阵的第一个元素a11为(-1,1)来搜索得到组合矩阵。

裁剪坐标 ----> NDC坐标

NDC坐标就是将裁剪坐标对应的xyz除以w,这就是透视分割算法(降维)。

NDC_X = X / W

NDC_Y = Y / W

NDC坐标 ----> 屏幕坐标

这需要一个视口变换矩阵,视口变换矩阵左乘NDC坐标就会得到对应的屏幕坐标。其中视口变换矩阵中fs和ns一般为0。

最后得到屏幕坐标的X = (Ws / 2 * NDC.x) + (NDC.x + Ws / 2), Y = -(Hs / 2 * NDC.y) + (NDC.y + Hs / 2)。而Ws * Hs为当前屏幕窗口的分辨率,且注意在windows中屏幕坐标系的规则

最新文章

  1. 关于docker容器是怎样建立新的namespace的。
  2. About MTU,TCP-MSS (转)
  3. 中小公司PMO不一样期间的责任
  4. HTML5矢量实现文件上传进度条
  5. java中equals和"=="的区别
  6. java的分层开发
  7. 使用ssh免密码登录其他机器
  8. phpcms v9 升级视频云问题推荐位不能添加
  9. Linux命令自己总结
  10. android中的Handler
  11. Myeclipse中tomcat所应用的JDK设置
  12. berserkJS(大名:狂暴JS / 昵称:疯子JS)
  13. Qt编程之QString 处理换行
  14. form表单提交之前推断
  15. c# splitter控件使用简介
  16. VS2012 添加服务引用常见错误
  17. jmeter 非gui 模式跑jmx
  18. SQLServer与MySQL约束/索引命名的一些差异总结
  19. Mysql 远程连接服务器
  20. Maven CXF wsdl2Java List<Xxx>生成ArrayOfXxx包装对象 解决方法

热门文章

  1. maven 常用命名
  2. Cai Xukun and Orz Pandas Gym - 102309C
  3. JVM之调优及常见场景分析
  4. 开源框架TLog核心原理架构解析
  5. 「HTML+CSS」--自定义按钮样式【002】
  6. Spring Boot MVC 单张图片和多张图片上传 和通用文件下载
  7. C++并发与多线程学习笔记--unique_lock详解
  8. Asp.Net Core 5 REST API 使用 JWT 身份验证 - Step by Step
  9. 消息中间件-RabbitMQ消息可靠性和插件化机制
  10. Go-23-接口