首先坐标系统开始许知道2D里常Ren笛卡坐标系统面识点二维(XY)X表示水轴坐标Y表示轴坐标3维坐标系增加Z般表示深度表示三维坐标系点三参数(XYZ)里笛卡三维系统左手螺旋右手螺旋右手螺旋右手手指卷曲方指Z轴正方拇指指X轴正方左手螺旋左手手指卷曲方指Z轴负方实际方旋转坐标系然保持身特性计算机图形学常坐标系左手坐标系:
X 正轴右
Y 正轴
Z 正轴指屏幕里
矢量
什矢量?句话坐标集合首先二维矢量开始(XY):例矢量P(45)(般>表示矢量)认矢量P代表点(45)原点指(45)方长度箭头谈矢量长度指原点该点距离二维距离计算公式
| P | sqrt( x^2 + y^2 )
里趣事实:1D(点单坐标轴)方根绝值讨三维矢量:例P(4 5 9)长度
| P | sqrt( x^2 + y^2 + z^2 )
代表笛卡3D空间点原点该点箭头代表该矢量关操作节里讨更知识
矩阵
开始简单开始:二维矩阵44矩阵什44?三维坐标系里需附加行列完成计算工作二维坐标系需33矩阵着意味着3D中4水参数4垂直参数16例:
4x4单位矩阵
| 1 0 0 0 |
| 0 1 0 0 |
| 0 0 1 0 |
| 0 0 0 1 |
矩阵相改变称单位阵例矩阵:
| 10 7 22 45 |
| sin(a) cos(a) 34 32 |
| 35 28 17 6 |
| 45 99 32 16 |
关矢量矩阵操作
已介绍非常简单基概念面知识三维图形什关系呢?
节介绍3D变换基知识概念然数学知识讨
关矢量矩阵操作两矢量开始:
( x1 y1 z1 ) + ( x2 y2 z2 ) ( x1 + x2 y1 + y2 z1 + z2 )
简单现矢量系数:
k ( x y z ) ( kx ky kz )
面公式称点积表示:
(x1 y1 z1 ) ( x2 y2 z2 ) x1x2 + y1y2 + z1z2
实际两矢量点积模积等两矢量夹角余弦
cos (V ^ W) V W | V | | W |
注意^表示指数两矢量夹角点积计算光线面夹角计算阴影节里会详细讨
现讨叉:
( x1 y1 z1 ) X ( x2 y2 z2 )
( y1z2 z1y2 z1x2 x1z2 x1y2 y1x2 )
叉计算屏幕法量非常
OK已讲完矢量基概念开始两矩阵矢量相加非常相似里讨设I矩阵行J矩阵列(ij)矩阵元素讨3D变换关重矩阵操作原理两矩阵相M x N <> N x M例:
A 4x4矩阵相公式
果 A(aij)4x4 B(bij)4x4
A x B
| S> a1jbj1 S> a1jbj2 S> a1jbj3 S> a1jbj4 |
| |
| S> a2jbj1 S> a2jbj2 S> a2jbj3 S> a2jbj4 |
| |
| S> a3jbj1 S> a3jbj2 S> a3jbj3 S> a3jbj4 |
| |
| S> a4jbj1 S> a4jbj2 S> a4jbj3 S> a4jbj4 |
中 j1234
果 AxB(cik)4x4 行写:
cik S>4 j1 aijbjk
( a1 a2 a3 ) x B
(Sum(aibi1) + b41 Sum(aibi2) + b42 Sum(aibi3) + b43 )
现试着矩阵单位阵解矩阵相性质矩阵矢量相结合起面公式3D矢量4x4矩阵(外三维矢量)果B(bij)4x4:
( a1 a2 a3 ) x B (S>aibi1 + b41 S>aibi2 + b42 S>aibi3 + b43 )>
矢量矩阵操作公式里开始代码数学间联系开始清晰
变换
已见象样公式:
t( tx ty ) ( x y ) > ( x + tx y + ty )
二维笛卡坐标系移等式面缩放公式:
s( k ) ( x y ) > ( kx ky )
旋转等式
r( q ) ( x y ) > ( x cos(q) y sin(q) x sin(q) + y cos(q) )
二维公式三维里公式形式然相
移公式:
t( tx ty tz ) ( x y z ) > ( x + tx y + ty z + tz )
缩放公式:
s( k ) ( x y z ) > ( kx ky kz )
旋转公式(围绕Z轴):
r( q ) ( x y z ) > ( x cos(q) y sin(q) x sin(q) + y cos(q) z )
写出二维中样变换公式通变换矩阵新矢量新矢量指变换点面三维变换矩阵:
移(tx ty tz)矩阵
| 1 0 0 0 |
| 0 1 0 0 |
| 0 0 1 0 |
| tx ty tz 1 |
缩放(sx sy sz)矩阵
| sz 0 0 0 |
| 0 sy 0 0 |
| 0 0 sx 0 |
| 0 0 0 1 |
绕X轴旋转角q矩阵
| 1 0 0 0 |
| 0 cos(q) sin(q) 0 |
| 0 sin(q) cos(q) 0 |
| 0 0 0 1 |
绕Y轴旋转角q矩阵
| cos(q) 0 sin(q) 0 |
| 0 1 0 0 |
| sin(q) 0 cos(q) 0 |
| 0 0 0 1 |
绕Z轴旋转角q矩阵
| cos(q) sin(q) 0 0 |
|sin(q) cos(q) 0 0 |
| 0 0 1 0 |
| 0 0 0 1 |
已结束关变换部分通矩阵三维点进行变换
面法量
面坦限指特定方表面定义面:
Ax + By + Cz + D 0
中 A B C称面法量D面原点距离通计算面两矢量叉积面法量两矢量需三点P1P2P3逆时针排列:
矢量1 P1 P2
矢量2 P3 P2
计算法量:
法量 矢量1 X 矢量2
D移等式右边:
D (Ax + By + Cz)
D (A1x + B2y + C3z)>
更简单
D Normal P1>
计算ABC分量简化操作等式:
A y1 ( z2 z3 ) + y2 ( z3 z1 ) + y3 ( z1 z2 )
B z1 ( x2 x3 ) + z2 ( x3 x1 ) + z3 ( x1 x2 )
C x1 ( y2 y3 ) + x2 ( y3 y1 ) + x3 ( y1 y2 )
D x1 ( y2z3 y3z2 ) x2 ( y3z1 y1z3 ) x3 ( y1z2 y2z1 )
三维变换
存储坐标
实现矩阵系统
实现三角法系统
创建变换矩阵
创建透视
变换象
存储坐标
首先编写星空模拟代码基结构什样?象描述存储?解决问题首先思考问题:需什样坐标系?明显答案:
屏幕坐标系:相显示器原点2D坐标系
坐标系:相象原点3D坐标系
忘记变换中间坐标系例:
世界坐标系:相3D世界原点三维坐标系
齐(视点)坐标系:世界坐标系变换观察者位置世界坐标系原点
面坐标基结构:
二维坐标
typedef struct
{
short x y
}_2D
三维坐标
typedef struct
{
float x y z
}_3D
里定义称顶点坐标结构顶点词指两两菱形边
交点顶点简单认描述系统矢量
坐标系坐标
typedef struct
{
_3D Local
_3D World
_3D Aligned
}Vertex_t
实现矩阵系统
需存储矩阵4x4浮点数矩阵中需做变换定义矩阵:
float matrix[4][4]
然定义函数拷贝时矩阵全局矩阵
void MAT_Copy(float source[4][4] float dest[4][4])
{
int ij
for(i0 i<4 i++)
for(j0 j<4 j++)
dest[i][j]source[i][j]
}
简单现写两矩阵相函数时理解面关矩阵相公式代码:
void MAT_Mult(float mat1[4][4] float mat2[4][4] float dest[4][4])
{
int ij
for(i0 i<4 i++)
for(j0 j<4 j++)
dest[i][j]mat1[i][0]*mat2[0][j]+mat1[i][1]*mat2[1][j]+mat1[i][2]*mat2[2][j]+mat1[i][3]*mat2[3][j]
}
mat1矩阵1
mat2矩阵2
dest相新矩阵
现明白?现设计矢量矩阵相公式
void VEC_MultMatrix(_3D *Sourcefloat mat[4][4]_3D *Dest)
{
Dest>xSource>x*mat[0][0]+Source>y*mat[1][0]+Source>z*mat[2][0]+mat[3][0]
Dest>ySource>x*mat[0][1]+Source>y*mat[1][1]+Source>z*mat[2][1]+mat[3][1]
Dest>zSource>x*mat[0][2]+Source>y*mat[1][2]+Source>z*mat[2][2]+mat[3][2]
}
Source源矢量(坐标)
mat变换矩阵
Dest目标矩阵(坐标)
已矩阵变换函数错吧
注意里矩阵变换学矩阵变换
般YTXT变换矩阵里Y XT
矩阵T4x4矩阵
实现三角法系统
C编译器带三角函数数学库需简单三角函数时次正弦余弦计算阶法量运算提高计算速度建立三角函数表首先决定需角度数然方面值代:
float SinTable[256] CosTable[256]
然宏定义会角度变成正值360度角度进行周期变换然返回需值果需角度数2幂次&代程序运行更快例256程序中量选取2幂次
三角法系统:
#define SIN(x) SinTable[ABS((int)x&255)]
#define COS(x) CosTable[ABS((int)x&255)]
旦已定义需东西建立初始化函数程序中调宏
void M3D_Init()
{
int d
for(d0 d<256 d++)
{
SinTable[d]sin(d*PI1280)
CosTable[d]cos(d*PI1280)
}
}
建立变换矩阵
面C编写变换矩阵代码
float mat1[4][4] mat2[4][4]
void MAT_Identity(float mat[4][4])
{
mat[0][0]1 mat[0][1]0 mat[0][2]0 mat[0][3]0
mat[1][0]0 mat[1][1]1 mat[1][2]0 mat[1][3]0
mat[2][0]0 mat[2][1]0 mat[2][2]1 mat[2][3]0
mat[3][0]0 mat[3][1]0 mat[3][2]0 mat[3][3]1
}
定义单位阵
void TR_Translate(float matrix[4][4]float txfloat tyfloat tz)
{
float tmat[4][4]
tmat[0][0]1 tmat[0][1]0 tmat[0][2]0 tmat[0][3]0
tmat[1][0]0 tmat[1][1]1 tmat[1][2]0 tmat[1][3]0
tmat[2][0]0 tmat[2][1]0 tmat[2][2]1 tmat[2][3]0
tmat[3][0]tx tmat[3][1]ty tmat[3][2]tz tmat[3][3]1
MAT_Mult(matrixtmatmat1)
MAT_Copy(mat1matrix)
}
txtytz移参数
matrix源矩阵目标矩阵
矩阵移函数
void TR_Scale(float matrix[4][4]float sxfloat sy float sz)
{
float smat[4][4]
smat[0][0]sx smat[0][1]0 smat[0][2]0 smat[0][3]0
smat[1][0]0 smat[1][1]sy smat[1][2]0 smat[1][3]0
smat[2][0]0 smat[2][1]0 smat[2][2]sz smat[2][3]0
smat[3][0]0 smat[3][1]0 smat[3][2]0 smat[3][3]1
MAT_Mult(matrixsmatmat1)
MAT_Copy(mat1matrix)
}
矩阵缩放
void TR_Rotate(float matrix[4][4]int axint ayint az)
{
float xmat[4][4] ymat[4][4] zmat[4][4]
xmat[0][0]1 xmat[0][1]0 xmat[0][2]0
xmat[0][3]0
xmat[1][0]0 xmat[1][1]COS(ax) xmat[1][2]SIN(ax)
xmat[1][3]0
xmat[2][0]0 xmat[2][1]SIN(ax) xmat[2][2]COS(ax) xmat[2][3]0
xmat[3][0]0 xmat[3][1]0 xmat[3][2]0 xmat[3][3]1
ymat[0][0]COS(ay) ymat[0][1]0 ymat[0][2]SIN(ay) ymat[0][3]0
ymat[1][0]0 ymat[1][1]1 ymat[1][2]0 ymat[1][3]0
ymat[2][0]SIN(ay) ymat[2][1]0 ymat[2][2]COS(ay) ymat[2][3]0
ymat[3][0]0 ymat[3][1]0 ymat[3][2]0 ymat[3][3]1
zmat[0][0]COS(az) zmat[0][1]SIN(az) zmat[0][2]0 zmat[0][3]0
zmat[1][0]SIN(az) zmat[1][1]COS(az) zmat[1][2]0 zmat[1][3]0
zmat[2][0]0 zmat[2][1]0 zmat[2][2]1 zmat[2][3]0
zmat[3][0]0 zmat[3][1]0 zmat[3][2]0 zmat[3][3]1
MAT_Mult(matrixymatmat1)
MAT_Mult(mat1xmatmat2)
MAT_Mult(mat2zmatmatrix)
}
ax绕X轴旋转角度
ay绕Y轴旋转角度
az绕Z轴旋转角度
矩阵旋转
建立透视
建立象立体视觉显示器事物起离外事物离远透视问题直困绕问题许方法3D世界2D屏幕投影公式:
P( f )(x y z)>( f*x z + XOrigin f*y z + YOrigin )
中f焦点距离表示观察者屏幕距离般80200厘米间XOriginYOrigin屏幕中心坐标(xyz)齐坐标系投影函数应该什样?
#define FOCAL_DISTANCE 200
定义焦点距离
void Project(vertex_t * Vertex)
{
if(Vertex>Alignedz)
Vertex>Alignedz1
Vertex>Screenx FOCAL_DISTANCE * Vertex>Alignedx Vertex>Alignedz + XOrigin
Vertex>Screeny FOCAL_DISTANCE * Vertex>Alignedy Vertex>Alignedz + YOrigin
}
屏幕投影坐标
0做数z进行判断
变换象
然已掌握变换顶点工具应该解需执行步骤
初始化顶点坐标
二设置全局矩阵单位阵
三根象尺寸缩放全局矩阵
四根象角度旋转全局矩阵
五根象位置移动全局矩阵
六坐标全局矩阵世界坐标系
七设置全局矩阵单位阵
八观测者位置负值移全局矩阵
九观测者角度负值旋转全局矩阵
十世界坐标系全局矩阵相齐坐标系
十投影齐坐标系屏幕坐标
:坐标系>世界坐标系>齐坐标系>屏幕坐标系
边形填充
边形结构
发现三角形
绘制三角形
边形结构
存储边形?首先必须知道种状态边形二维边形初始边形三维仅需时二维边形够设置二维顶点数常量没浪费存:
2D结构:
typedef struct
{
_2D Points[20]
int PointsCount
int Texture
}Polygon2D_t
3D 结构
typedef struct
{
int Count
int * Vertex
int Texture
Vertex_t PMN
}Polygon_t
什顶点数组包含整数值呢仔细思考例立方体三边形公
顶点三边形里存储变换顶点会浪费存时间更愿意存储
象结构里边形结构里会放置相应顶点索引请
面结构:
typedef struct
{
int VertexCount
int PolygonCount
Vertex_t * Vertex
Polygon_t * Polygon
_3D Scaling
_3D Position
_3D Angle
int NeedUpdate
}Object_t
发现三角形
绘制三角形绘制意边形简单边形分割成
三顶点形状种方法非常简单直接:
void POLY_Draw(Polygon2D_t *Polygon)
{
_2D P1P2P3
int i
P1 Polygon>Points[0]
for(i1 i < Polygon>PointsCount1 i++)
{
P2Polygon>Points[i]
P3Polygon>Points[i+1]
POLY_Triangle(P1P2P3Polygon>Texture)
}
}
面算法凹边形太适
_____
|\ |
| \ |
|____\|
绘制三角形
现样三角形函数样画出条关直线发现
行起始结实x坐标通定义两简单宏定义开始区
垂直两点两数:
#define MIN(ab) ((a#define MAX(ab) ((a>b)(a)(b))
#define MaxPoint(ab) ((ay > by) a b)
#define MinPoint(ab) ((by > ay) a b)
然定义三宏区三点:
#define MaxPoint3(abc) MaxPoint(MaxPoint(ab)MaxPoint(bc))
#define MidPoint3(abc) MaxPoint(MinPoint(ab)MinPoint(ac))
#define MinPoint3(abc) MinPoint(MinPoint(ab)MinPoint(bc))
许注意MidPoint3宏总正常工作取决三点排列序
例aif语句修正缺点面函数代码:
void POLY_Triangle(_2D p1_2D p2_2D p3char c)
{
_2D p1dp2dp3d
int xd1yd1xd2yd2i
int LxRx
首先三点进行排序:
p1d MinPoint3(p1p2p3)
p2d MidPoint3(p2p3p1)
p3d MaxPoint3(p3p1p2)
调宏时候什会点序改变?(作者清楚)点逆时针传递试图改变宏屏幕显示垃圾现确定中间点做检查
种状态中间点似错误修正:
if(p2y < p1y)
{
p1dMinPoint3(p2p1p3)
p2dMidPoint3(p1p3p2)
}
点排列序起奇怪试图改变东西乱套理解
接受结现计算增量
xd1p2dxp1dx
yd1p2dyp1dy
xd2p3dxp1dx
yd2p3dyp1dy
OK第步已完成果增量 y:
if(yd1)
for(ip1dy i
x起始坐标计算x值前点起始点间加增量 y斜率( x y )
相反值
Lx p1dx + ((i p1dy) * xd1) yd1
文香网httpwwwxiangdangnet
《香当网》用户分享的内容,不代表《香当网》观点或立场,请自行判断内容的真实性和可靠性!
该内容是文档的文本内容,更好的格式请下载文档