3D图形算法


    3D简介
      首先坐标系统开始许知道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

    《香当网》用户分享的内容,不代表《香当网》观点或立场,请自行判断内容的真实性和可靠性!
    该内容是文档的文本内容,更好的格式请下载文档

    下载文档到电脑,查找使用更方便

    文档的实际排版效果,会与网站的显示效果略有不同!!

    需要 1 香币 [ 分享文档获得香币 ]

    下载文档

    相关文档

    首次适应算法最佳适应算法

    姓名:学号:实验名称:进程调度模拟实验 实验目的:了解动态分区存储管理方式中的数据结构和分配算法,加深对动态分区存储管理方式及其实现技术的理解。实验内容:#include<iostream.h...

    3年前   
    1631    0

    香港3D奇幻世界推出“3D圣诞”

    香港3D奇幻世界推出“3D圣诞”  每年圣诞节来临之前,香港各大旅游景点和卖场都会打扮一番,迎接圣诞出游高峰。然而随着人们生活水平的提高,对景点游玩设施的需求和趣味的要求也越来越高。因此,很多...

    10年前   
    531    0

    粒子群算法(优化算法)毕业设计论文

     毕 业 论 文 题 目 粒子群算法及其参数设置 专 业 信息与计算科学 班 级 ...

    5年前   
    1472    0

    概率统计、算法

    1. 统计1. 如图是样本容量为200的频率分布直方图.根据此样本的频率分布直方图估计,样本数据落在[6,10)内的频数为_____ 642. 甲、乙两名同学在五次考试中数学成绩统计用茎叶图表...

    10年前   
    810    0

    第1课生活与算法

    课题第一课 生活与算法日期课时安排1课时课型新授课教学目标1、 通过探讨、解决具体生活问题的方法与步骤,了解算法的概念2、 通过体验、观摩形象直观的生活实例,学会建立数学模型,了解变量的概念...

    2年前   
    624    0

    立体图形与平面图形说课稿

    立体图形与平面图形说课稿我说课的内容是《立体图形与平面图形》,选自人民教育出版社七年级数学上册第三章第一节。本节课共分3个课时,我选的内容是第3课时,下面我从三个方面进行说课。 一、教学理念 ...

    4年前   
    1174    0

    立体图形与平面图形教案

    立体图形与平面图形 教学设计(一)第一课时教学内容:七年级数学上册第三章第一节,教材P114-116页教学目标:1.知识与技能观察认识我们周围的规则物体,能找到与它们相似的立体图形;正确识别...

    4年前   
    1309    0

    《基于unity的3D校园的设计与实现》

    基于unity的3D校园的设计与实现 Design and implementation of 3D camp...

    3年前   
    751    0

    3D Max上机实验内容及步骤

    3D Max上机实验内容及步骤 3D Max上机实验内容及步骤由我整理,希望给你工作、学习、生活带来方便。 上机实验一要求: 1、启动3d 2、熟悉窗口组成 ...

    1年前   
    470    0

    大学生3D动画专业实习总结

    大学生3D动画专业实习总结  这十天的实训我们团队始终保持着兴趣和激情,她们没有一次旷课,迟到的现象,有时甚至一天都待在机房,目的就是为了动画的完美.过程是辛苦的,同时也是快乐的.安排过来的老...

    11年前   
    543    0

    论文:3D打印机设计

    3D打印是最近两年开始流行的一种快速成形技术, 它以数字模型文件为基础, 通 过逐层打印的方式来构造物体. 我们日常生活中的打印机能打印一些平面纸张材料, ...

    5年前   
    1354    0

    3D打印机毕业设计

    3D打印是最近两年开始流行的一种快速成形技术, 它以数字模型文件为基础, 通过逐层打印的方式来构造物体. 我们日常生活中的打印机能打印一些平面纸张材料, 而3D打印机打印出的是立体塑品产品.文章...

    5年前   
    1570    0

    3D打印控制系统设计

     3D打印机控制系统设计(小组题目:3D打印机研制) 摘 要3D 打印技术是种增材快速成型技术, 在创新产品的设计和制造中应用越来越广泛,其中的 FDM(熔融堆积成型技术) 3D打印机具...

    3年前   
    660    0

    3d培训总结范文

    3d培训总结范文  有了一个月的学习,现在提到三维动画,我们不再是一脸迷茫,不知所云了,我们对此有了最初的认识,并且在老师的指导下会完成几个简单的小作品,学习3dmax的心得体会。 还记得第一...

    12年前   
    573    0

    3D打印实训报告书

     快速成型与快速模具3D打印实训报告书 姓名: 学号: 班级:机械班 专业:机械设计与制造 学院:机电工程与自动...

    3年前   
    3451    0

    如何提高学生对3D max 的学习兴趣

    如何提高学生对3D max 的学习兴趣  摘要:随着科技技术的不断发展和进步,计算机在生活与工作中被广泛运用,二维的信息展示方式已经不能满足现代人们对信息获取的需要,三维的信息显示方式已经成...

    11年前   
    9845    0

    三 走进图形世界

    三 走进图形世界1. 先想一想,再折一折,下面的图形那些是轴对称图形?你能找到几条对称轴?2. 下列现象是平移的画“—”,是旋转的画“○”3. 小蝌蚪找妈妈。(提示:四边形是有4条直的边和4...

    3年前   
    661    0

    数图形的学问

    数图形的学问一、内容概述数线段在教材中出现在第七册,认识了线段的基本概念和基本要素。教材在二年级(第三册)思考题中曾出现过两个分点的数线段。而且学生在三年级(第五册)中认识角时曾经有过数角的经...

    4年前   
    1094    0

    认识图形(二)

    《认识图形》说课稿《认识图形》这部分内容,是在第一册认识了立体图形的基础上,让学生初步认识平面图形,为以后学习更深层的几何知识打下基础。教材体现了从立体到平面的设计思路,注重让学生通过操作活动...

    3年前   
    617    0

    通信算法工程师的职责

    通信算法工程师的职责职责:1. 通信算法工程师,能够独立承担通信系统设计方案的编写,通信系统各种接口设计。移动通信系统设计及性能分析。包括:1)完成海宽带通信系统的算法设计与前期仿真,对仿真结...

    2年前   
    375    0