游戏数学和算法
文章平均质量分 86
FreedomRoad~
专注于app底层/架构/算法/业务工作流程,记录进步的足迹和感悟。
展开
-
MD5算法使用简析
总结:MD5算法是对一定的输入内容计算消息摘要,文件MD5算法是对整个文件的内容以二进制方式读取对内容进行分组筛选计算消息摘要。简单的复制一个文件并不能再计算并不能改变MD5值,因为文件内部的二进制内容并没有改变。MD5可以校验一个文件在传输的过程中是否被改变了,他人改变,或者自己开发的上传下载程序本身改变了传输的内容。MD5因为是非可逆的,因此可以在密码存取中直接存放MD5值。MD5是不够安原创 2015-03-23 08:29:35 · 784 阅读 · 0 评论 -
3D数学之-向量矩阵欧拉角和四元数
摘要:向量运算和点乘和叉乘很重要。物体变换等价于相反的量变换坐标系(可以不相反的顺序例如欧拉角)。坐标系间转换,例如物惯到惯物,那么需要相反的顺序相反的变换(逆)执行变换。矩阵是代表物体的变换,该变换是用物体变换,假设变换到新的用旧坐标系表示的新的坐标系。矩阵的行向量是新坐标系的基向量,是用原坐标系轴假设变换(旋转或平移)到一个新的位置后原创 2015-05-31 16:32:49 · 7189 阅读 · 0 评论 -
左右手坐标系区别和联系
本文是分析,所谓的右手坐标系转换为左手坐标系需要的:z轴取反;x轴取反(或者改变摄像机位置); 渲染绕序改变,其中的进一步的原因。1.三角网格顶点数据改变记得左手坐标系中摄像机坐标系是z轴正方西向里的,右手坐标系中摄像机坐标系是z轴负方西向里的,所以:1)经典:右手坐标系转换为左手的时候需要三角网格数据z轴翻转2)美术软件中:3DS MAX中却要y-z相互翻原创 2015-08-09 23:37:42 · 9040 阅读 · 4 评论 -
旋转四元数的理解-凌乱总结
// 1.四元数连续变换,左右手坐标系关系/*OGRE中用了标准乘法,但是父节点变换a和子节点变换b?他们之间的连续变换依然是用a*b进行的,每次子节点渲染时候,需要递归到根节点进行变换刚好是从根节点向下连续变换。因为右手坐标系中顺时针四元数变换为:a-1pa,连续变换为: (ab)-1 p(ab),所以是父节点乘以子节点刚好实现连续四元数旋转变换。记得右手坐标系顺时针变换,因为相对于左手坐原创 2015-09-05 15:21:07 · 6727 阅读 · 0 评论 -
坐标变换深入理解
一、变换的前提考虑坐标变换时候,一定要分清楚几个前提条件:1.当前是否需要进行变换,通过一些相对位置是否能够求取出来; 通过中间位置(屏幕位置)得到结果,或者通过方便的函数计算出来,不需要自己计算,如UnityEngine.RectTransformUtility.ScreenPointToLocalPointInRectangle。2.当前是左手坐标系还是右手坐标系。(cocos原创 2016-05-24 10:58:15 · 7620 阅读 · 0 评论 -
物惯(子到父节点)变换顺序原因和不同坐标系下的变换顺序详解
在基于同一个参考坐标系中(也就是子节点到父节点坐标系中的变换),对于一个基本变换,D3D中要先缩放->旋转->平移。OGL中要先平移->旋转->缩放,其中的原因解释?OGL中是左乘矩阵,因此子节点变换到父节点是先平移后旋转缩放,才是正确的变换顺序。关于先平移后旋转不是OGL中解释的每次是基于当前嵌套坐标系变换,而是因为变换的矩阵乘法顺序和乘法规则规定的。D3D中先旋转后平移才能原创 2016-05-28 11:20:52 · 3332 阅读 · 1 评论 -
从描述来求取变换(矩阵欧拉角四元数)的思想
从变换来求取变换矩阵,欧拉角,或四元数,首先需要明天矩阵,欧拉角,四元数的含义。然后用它们来描述人类理解的变换,对于矩阵变换的求取:1)用变换前坐标系作为参考坐标系,先取得一个变换前向量,然后取得一个变换后向量。2)通过相对于参考坐标系数值不变;数值对称取反;作垂线平分线于参考坐标系,假设转换为已知坐标轴关系例如旋转基向量求取;通过向量的点积投影和叉乘法向量,三角关系sin theta,c原创 2016-05-27 10:44:29 · 1225 阅读 · 0 评论 -
3D数学之-图形渲染数学
一、图形固定管道渲染流程// 首先设置观察场景的方式SetupTheCamera();// 清除深度缓存ClearZBuffer();// 设置环境光和雾化[如果需要]SetGlobalLightAndFog();//1. 世界场景级别的操作// 得到可见物体列表potentiallyVisibleObjectList = HighLevelVisibili原创 2015-06-17 21:38:54 · 3644 阅读 · 0 评论 -
图形学数学变换的领悟-持续更新
一、基本概念和前提基本矩阵含义,四元数含义,欧拉角。理解矩阵的基向量特点分解组合作用;四元数有一般的信息在变换乘法中;欧拉角存在万向锁。不同坐标系下乘法顺序,矩阵逆,旋转绕向,正面定义不同。变换坐标系区别(左手坐标系,右手坐标系是不同的,3ds max坐标系),矩阵行列式的区别,乘法顺序的区别,正反面的区别,一定要清楚变换前提条件,否则很容易导致难以觉察的计算错误。原创 2016-07-01 10:42:37 · 1070 阅读 · 0 评论 -
关键帧逐帧蒙皮动画原理
一、关键帧动画怎么插件的,还有GPU蒙皮关键帧动画也称为属性插值动画,一般用于2d非图像质变的动画,主要是对图像的大小,旋转,移动进行插值的关键帧动画,只需要一幅图片就可以,插值方式有线性插值,样条插值。二、逐帧动画是每个帧都有图片,用一个图片序列,按照时间间隔来播放动画,用动画设计软件进行动画设计时候使用关键帧动画设计,但是输出为逐帧动画,2d动画很多采用这个模式。三原创 2017-08-09 23:27:36 · 1929 阅读 · 1 评论 -
unity3d渲染路径整理
方向光源是最不消耗GPU资源的。点光源的阴影较消耗GPU资源。聚光灯是较消耗GPU资源的。Area light区域光源无法用于实时光照,只适用于光照贴图烘培。Cookie如果是平行光或聚光灯 那么可以是2D的纹理遮罩贴图,如果是点光源那么cookie要是cubemap texture立方体纹理。unity3d渲染路径:只有平行光在forward渲染模式下支持阴影,其它光源类型在pl原创 2017-09-18 13:14:50 · 1277 阅读 · 0 评论 -
骨骼动画原理和实例之MD5SkeletalAnimation
项目说明和代码已经上传至git hub,见:https://github.com/Jeromecen/MD5SkeletalAnimation原创 2015-09-26 21:29:53 · 1733 阅读 · 0 评论 -
递归函数的理解
前言:有很多复杂算法都包含了递归算法,特别是关于树形数据结构遍历的情景,所以正确深入理解递归算法是很有必要的。一、递归函数的基本概念递归函数机制理解:调用函数的静态和动态机制理解:调用函数和被调用函数虽然是同一个静态代码,但是运行时被函数运行的栈空间独立于调用函数的栈空间,调用点不同,函数状态栈地址也不同,所以运行时调用函数和被调用函数在代码副本还是数据副本上都是完全不同的,只有通过返回值和调用点进行联系。递归的调用形式:直接递归调用F1->F1,间接递归F1->F2->F1,很多情况下是直接递归原创 2015-04-28 08:32:11 · 2441 阅读 · 2 评论 -
BMP文件解析
BMP文件通常是不压缩的,所以它们通常比同一幅图像的压缩图像文件格式要大很多。例如,一个800×600的24位几乎占据1.4MB空间。因此它们通常不适合在因特网或者其他低速或者有容量限制的媒介上进行传输。根据颜色深度的不同,图像上的一个像素可以用一个或者多个字节表示,它由n/8所确定(n是位深度,1字节包含8个数据位)。图片浏览器等基于字节的ASCII值计算像素的颜色,然后从调色板中读出相原创 2015-04-09 08:53:55 · 2516 阅读 · 0 评论 -
灰度图的理解
前提用十六进制查看图像文件需要注意:beyond compare/notpad++查看图像的十六进制文件,数值数据是小端模式存放的二进制和数据在内存中的表现一致,只是大于1字节的数据在内存中赋值(通过结构体赋值也是一样的)给相应的整型时,不用大小端转换,赋值后会直接得到整型的结果。1. 什么是灰度图?灰度图的RGB值相等灰度图调色板的值就是ARGB 205,0,0,0到原创 2015-04-10 23:12:56 · 22644 阅读 · 0 评论 -
CRC计算方法与实例
来自:http://www.baiheee.com/Documents/090107/090107122214.htmCRC冗余循环校验,传输的帧或者序列为n位,生成冗余码多项式为2(^k)+...+1,用n左移k位作为被除数,用模2运算(加法进位的舍弃,减法是制造商和减数相加得到被减数,其实减法可以用异或运算得到商)被除数除以生成多项式的数,得到余数,将余数放到被除数的n位,得到kn序列数据转载 2015-03-24 23:44:23 · 25303 阅读 · 0 评论 -
Huffman霍夫曼压缩编码算法实现分析
/*霍夫曼编码模型:思想是压缩数据出现概率高的用短编码,出现概率低的用长编码,且每个字符编码都不一样。压缩数据单个字符出现的概率抽象为叶子节点的权值,huffman树叶子节点到根节点的编码(是父节点左子节点那么填0,否则填1)作为字符的唯一编码.实现时候需要注意的规则:1)最左的放置在左边,作为父节点的左节点。2)每次都从没有设置父节点的所用节点中(叶子和分支节点一样对待),从数组小原创 2015-04-12 20:11:16 · 5551 阅读 · 0 评论 -
Dijkstra算法详解
算法思想:采用图的BFS(Breadth-First-Search)广度搜索的贪心算法,广度一遍后比较得出当前最短路径点(贪心),再以该点作为中间点,层层向外扩展,直到遍历所有的图节点。算法步骤:1.设置当前点集初态,列出V0到各顶点的距离。2.从V0到当前点集中找出距离最短的点Vj(包括新路径和之前的路径)及相应的路径,并将其余各点的已有路径与经过该路径的新路径比较,若新路径转载 2015-04-15 23:24:55 · 1137 阅读 · 0 评论 -
deflate算法总结
一、LZ77算法基本概念LZ77算法的说明网上很多,本文为个人见解,仅供参考。本人认为LZ77算法其实是字典压缩的一个变种,与字典压缩不同的是,它的字典是动态生成的并且只有一个,一般选取一定数量的最近压缩过数据。保存 这些数据的结构叫做滑动窗口,所以LZ77有被常称作滑动窗口算法。至于这么生成字典的原因,其实很简单,因为我们认为一个要压缩的字符串很有可能与上下 文相关,也就是说很有可能转载 2015-04-21 08:55:29 · 21181 阅读 · 4 评论 -
3D数学之-几何图元和几何检测
这段时间满脑子都是向量,射线,三角形,平面,AABB的几何图元和他们之间的空间关系,几何检测分类分解处理组合结果之类的情景。感觉回到的热爱几何和数学的中学时代,希望自己把这样的几何向量化描述,抽象模型和分解组合演绎计算的思想能够不断积累思考下去,变成一种比较强的能力,类似设计模式,实际编程优化重构代码的能力一样。一、几何图元1.射线射线在计算机图形学中占有重要的原创 2015-06-06 19:28:41 · 2633 阅读 · 0 评论 -
3D数学之-三角形网格
在3D物体中,所有的几何变换,几何检测,动画,渲染着色都要基于三角网格进行,所以三角网格的基本原理和优化策略都是是非常重要的。一、三角网格的存储结构三角形网格是为了模拟一个物体连续的体积表面,三角形网格具有表示简单和操作简单的特性而成为事实上表示物体平滑表面的标准,其它多边形网格都可以简化为三角形网格,三角形需要表现三角形网格的顶点、边、面的信息。1.索引三角网格原创 2015-06-11 08:27:26 · 7368 阅读 · 0 评论 -
拾取技术和图形管道逆变换
总结:关于向量和点变换:3D数学中,向量可以表示点也可以表示向量,当表示点时候进行矩阵变换要用coord需要考虑平移w=1,当表示向量时候进行矩阵变换用normal不需要考虑平移w=0,用齐次向量常数是0表示向量不包括平移,非齐次向量常数是1表示的是空间点包括平移。关于投影变换:矩阵变换:将屏幕空间捕获到的位置,转换为游戏世界坐标系中的位置世界坐标系->观察坐标系->投影坐原创 2015-07-19 14:21:54 · 1043 阅读 · 0 评论 -
简单八叉树源码剖析
针对文章:http://www.brandonpelfrey.com/blog/coding-a-simple-octree/及其github:https://github.com/brandonpelfrey/SimpleOctree/ 中的代码剖析总结:1.空间模型思想:一个大的正方体或者长方体,只需要记录中心点向量和半边长向量,用这两个向量加减即得到8个子空间;8个子空间中的原创 2015-08-14 21:45:49 · 1837 阅读 · 0 评论 -
切线空间法线贴图生成和应用的理解
一、基于切线空间坐标系的法线贴图理解:使用法线贴图是因为在低模下想获得高模凹凸表面光照效果。因为基于模型坐标系的法线贴图,在换到不同的模型下时候法线贴图不能复用。故引入切线空间让法线贴图可以在相同网格形状模型(或许是子模型)但不同模型坐标系的多个模型间可以共享法线贴图。以下是我个人对切线空间求取,法线贴图求取,法线贴图计算光照的理解,不对之处欢迎指出:1)低模切线空间求取:假设:dp是网格上某三角...原创 2017-09-16 17:06:39 · 2600 阅读 · 0 评论