3D笔记杂烩

3D笔记杂烩
gamma系数就是灰度系数,改变gamma系数的值就是相当于改变色阶(图象亮度强弱的指数标准),gamma值越少,图象越亮.
调试d3d,将控制面板中D3DDebugging打开,进行调试,在选择调试信息输出等级的时候,可以选择more来获得更加多得详细信息。
http://nexe.gamedev.net/directKnowledge/default.asp?p=Debugging。
Direct3D9: (INFO) :MemFini!
Direct3D9: (WARN) :Memory still allocated!  Alloc count = 152
Direct3D9: (WARN) :Current Process (pid) = 00000fb8
Direct3D9: (WARN) :Memory Address: 00c95988 lAllocID= 1 dwSize=000047f8, (pid=00000fb8)
这里是检测出内存泄露了.
一般是内存信息什么的没有releasing和deleting掉.
之前遇到的一个问题lock is not supported when multi-sampling is enabled是因为shader debugging打开了,之后关闭了,就没有事情了。
刚才编译hlsl的时候,发现了x3025错误,后来的dx版本要使用D3DXSHADER_ENABLE_BACKWARDS_COMPATIABLITY|D3DXSHADER_DEBUG才能编译,特别是2008年的dx版本。

 DX默认的是D3DFILL_SOLID,如果出现D3DFILL_WIREFRAME的情况一定要设置回去。
CD3DArcBall:允许你将用户的输入解释为旋转或者平移.我们所要做的是将鼠标消息传递给这个类,并且将视图矩阵设为类的旋转或者平移矩阵就可以了.
点乘: a.b = ||a|| *||b|| * cosA, 一般用来判断为0,那么表明正交,>0,方向基本相同,<0,方向基本相反.使用点乘来计算投影.
给定两向量v,n,将其分解为v平和v垂,分别平行于和垂直于n,并且满足 v = v平+v垂,一般成平行分量v平为v在n 上的投影.
V平 = n * ||V平|| / ||n||.
cosA = ||V平||/||V|| cosA||V|| = ||V平||
V平= n*n*v/( ||n||*||n||).
叉乘得到的向量垂直于原来的两个向量.
a *b指向该平面的正上方,垂直于a和b.
||a*b|| = ||a|| * ||b|| * sinA.
||a*b|| 也等于以a和b为两边的平行四边形的面积.
如果a,b平行或任意一个为0,则a*b = 0,叉乘对零向量的解释是它平行于任意其他向量,点乘的解释是和任意其他向量垂直.
任意对角矩阵D,都有D转置矩阵= D,包括单位矩阵.
DirectX使用的行向量.
v = xp+yq+zr,向量v就表示成p,q,r的线性变换了,向量p,q,r称做基向量.这里基向量是笛卡尔坐标系
变换物体相当于以相反的量变换描述这个物体的坐标系.
2d里面是这样设置的:
逆时针旋转经常(不是必须)被认为是正方向,顺时针方向是负方向.
绕x轴旋转:
[ 1 0 0        
0 cosA sinA
0 -sinA cosA]
绕y轴旋转:
[cosA 0 -sinA
0  1 0
sinA 0 cosA]
绕z轴旋转:
[ cosA sinA 0
-sinA cosA 0
0 0 1]
绕轴n旋转角度A,那么获得的矩阵是:
[nx*nx*(1-cosA)+cosA     nx*ny*(1-cosA)-nz * sinA  nx*nz*(1-cosA) + ny*sinA
nx * ny *(1-cosA) - nz *sinA ny*ny*(1-cosA)+cosA  ny*nz*(1-cosA) - nx* sinA
nx * nz *(1-cosA)+ny * sinA ny * nz *(1-cosA) + nx* sinA nz*nz*(1-cosA)+cosA]
缩放:通过基向量构造矩阵,得到以单位向量n为缩放方向,k为因子的缩放矩阵:
s(n,k) = [ p]     [ 1 + (k-1)nx2  (k-1)nxny   (k-1)nxnz]
                    =
             [ q]     [ (k -1)nxny   1+(k-1)ny2   (k-1)nxnz]
             [ r]     [(k-1)nxnz  (k-1)nzny   1+(k-1)nz2]

投影意味着降维操作,有一种投影方法是在某个方向上用零做缩放因子,这种情况下,所有点都被拉平至垂直的轴(2D)或平面(3D),这种类型的投影称做正交投影,或者平行投影,因为从原来的点到投影点的直线相互平行.
n垂直于投影直线,而不是平行,3D中,向垂直于n的平面投影的矩阵如公式:
p(N) =   [1-nx2 -nxny -nxnz]
              [-nxny 1-ny2 -nynz]
              [-nxnz -nzny 1-nz2]
镜像: 将物体沿直线(2D中)或平面(3D中)翻折.
P(n) = [ 1-2nx2 -2nxny -2nxnz]
          [-2nxny 1-2ny2 -2nynz]
          [-2nxnz -2nzny 1-2nz2]
Hxy的意义是x,y坐标被坐标z改变
Hxy(s,t) = [1 0 0]
                [0 1 0]
                [s  t 1 ]

Hxz(s,t) = [ 1 0 0]
                [s  1 t]
                [0 0 1]

Hyz(s,t) = [1 s t]
                [0 1 0]
                [0 0 1] 

M物体->像机 = M物体->世界M世界->像机
P->像机 = P物体 M物体->像机
线形变换: 如果满足下式,那么映射f(a)就是线性的:
f(a+b) = f(a) + f(b)
以及F(ka) = kf(a).
仿射变换: 线性变换后接着平移,因此仿射变换的集合是线性变换的超集.任何线性变换都是仿射变换,但不是所有仿射变换都是线性变换.
如果存在一个逆变换可以"撤消"原变换,那么该变换是可逆的.
如果变换前后两向量夹角的大小和方向都不改变,该变换是等角.只有平移,旋转和均匀缩放是等角变换.
等角变换将会保持比例不变.
平移,旋转和镜像是仅有的正交变换.长度,角度,面积,和体积都保持不变.
刚体变换只改变物体的位置和方向,不包括形状,所有长度,角度,面积和体积都不变.平移和旋转是仅有的刚体变换,镜像并不被认为是刚体变换.
假设矩阵M有r行,c列,记法Mij表示从M中除去第i行和第j列后剩下的矩阵.显然,该矩阵有r-1行,c-1列,矩阵Mij称为M的余子式.

你可能感兴趣的:(3D笔记杂烩)