`
daojin
  • 浏览: 697649 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

【脚下生根】之深度探索安卓OpenGL投影矩阵

阅读更多

世界变化真快,前段时间windows开发技术热还在如火如荼,web技术就开始来势汹汹,正当web呈现欣欣向荣之际,安卓小机器人,咬过一口的苹果,winPhone开发平台又如闪电般划破了混沌的web世界。

相信很多开发者都在疑问,为什么世界不是围着我转?而是我在围着世界转。我的答案是,少林寺的和尚学打架,首先要学会站桩。要练功,先占三年桩。少林寺的和尚打架从来不围着别人转,而是别人围着他转。

世界的原理都是相通的,开发者一样,要做到脚下生根。

最近几天在看OpenGL的投影矩阵,自己也实现了一个投影矩阵:

 

【1 0 0 0】

【0 1 0 0】

【0 0 1 1/d]

[0 0 0 0]

 

其中d代表的是近平面的距离也就是near。

做任何事情,必须带着疑问去学习,这是我的原则,不然就不要学,尽信书不如无书,是懂非懂不如不懂。我的疑问是为什么OpenGL的投影矩阵那么复杂,我想复杂必然有其复杂的道理。经过一番研究,其根本原因是为了将实景体映射到一个立方体,范围是【-1,1】的边长为2的立方体。而不是直接变换到屏幕上。这就是OpenGL的想法。因此,像我那样直接转换到屏幕上就不对了。x,y经过这个变换后到-1,1. 而z的变换则必须满足线性变换的规则。这个推导的过程并不复杂。原理是,x,y按照线性比例进行压缩。z轴则进行一次线性变换以满足线性矩阵的要求。这些推导很简单,就不说了。

接下来要讲的东西更加出人意外,因为既然研究UI的底层实现,不能仅仅限于OpenGL。于是我又追根究底地剖解了一下Skia库。Skia库在3D上可以说在OpenGL面前就是小菜一碟。但是它在2D图形处理上,可以说OpenGL就是小菜一碟。因此互为补充。当然我研究的是Skia也增加了一些在2D图形进行3D特效的东东。其中有一些矩阵变换。刚好印证了我的矩阵是多么的正确。具体参照SkCamera.cpp这个文件。具体里面的那些数学矩阵运算怎么怎么进行的就不说了。根本原理就是我上面提到的那个投影矩阵。

 

这些东西很简单。不是吗?

 

具体OpenGL是怎么算的,稍微有点线性代数知识的人,高等代数等都可以看懂,下面是这个链接。

http://hi.baidu.com/dych_cnu/item/a7b78ba58a86e0208819d30f

void SkCamera3D::patchToMatrix(const SkPatch3D& quilt, SkMatrix* matrix) const {
    if (fNeedToUpdate) {
        this->doUpdate();
        fNeedToUpdate = false;
    }

    const SkScalar* mapPtr = (const SkScalar*)(const void*)&fOrientation;
    const SkScalar* patchPtr;
    SkPoint3D       diff;
    SkScalar        dot;

    diff.fX = quilt.fOrigin.fX - fLocation.fX;
    diff.fY = quilt.fOrigin.fY - fLocation.fY;
    diff.fZ = quilt.fOrigin.fZ - fLocation.fZ;

    dot = SkUnit3D::Dot(*(const SkUnit3D*)(const void*)&diff,
                        *(const SkUnit3D*)(((const SkScalar*)(const void*)&fOrientation) + 6));

    //	patchPtr的结构为{U,V,ORIGIN}其中U,V 代表列向量
	// ORIGIN 是坐标原点
	
    patchPtr = (const SkScalar*)&quilt;
	
	/*
	 其中matrix表示一个3x3的矩阵
	第一行代表U的系数,第二行是V的系数,第三行是diff 的系数
	matrix 的每一列代表的是一个坐标轴。
	*/
	//第一列
	matrix->set(SkMatrix::kMScaleX, SkScalarDotDiv(3, patchPtr, 1, mapPtr, 1, dot));
    matrix->set(SkMatrix::kMSkewY,  SkScalarDotDiv(3, patchPtr, 1, mapPtr+3, 1, dot));
    matrix->set(SkMatrix::kMPersp0, SkScalarDotDiv(3, patchPtr, 1, mapPtr+6, 1, dot));

	//第二列
    patchPtr += 3;
    matrix->set(SkMatrix::kMSkewX,  SkScalarDotDiv(3, patchPtr, 1, mapPtr, 1, dot));
    matrix->set(SkMatrix::kMScaleY, SkScalarDotDiv(3, patchPtr, 1, mapPtr+3, 1, dot)); 
    matrix->set(SkMatrix::kMPersp1, SkScalarDotDiv(3, patchPtr, 1, mapPtr+6, 1, dot));

	//第三列
    patchPtr = (const SkScalar*)(const void*)&diff;
    matrix->set(SkMatrix::kMTransX, SkScalarDotDiv(3, patchPtr, 1, mapPtr, 1, dot));
    matrix->set(SkMatrix::kMTransY, SkScalarDotDiv(3, patchPtr, 1, mapPtr+3, 1, dot));
    matrix->set(SkMatrix::kMPersp2, SK_UnitScalar1);
	
}

 

 

 

1
2
分享到:
评论

相关推荐

    返璞归真——让深度学习在课堂中生根发芽.pdf

    文章《返璞归真——让深度学习在课堂中生根发芽》提出了在数学课堂上实施深度学习的教学理念和策略,强调了在新一轮课程改革中培养学生的数学关键能力的重要性,特别是学生的深度学习能力。深度学习是指学生能够批判...

    生根粉的使用方法——ABT生根粉.doc

    ABT生根粉是一种高效的植物促根剂,广泛应用于各种植物的繁殖和栽培中,能够显著提高生根速度和生根率。它含有多种活性成分,可以刺激植物产生不定根,形成密集的根系,从而增强植物吸收水分和养分的能力。与传统的...

    深度学习让数学学科核心素养落地生根.pdf

    在当今的教育领域中,深度学习作为一种教育理念和学习方法,被广泛应用于教学中,尤其在数学学科中,通过深度学习可以有效地促进学生的核心素养落地生根。深度学习的特征在于,它强调通过创设直观的学习情境、推出...

    演讲稿:智慧总在孤独中生根.pdf

    在这篇主题为《智慧总在孤独中生根》的演讲稿中,章小鸭通过深入探讨孤独这一普遍心理现象,强调了孤独在个人成长和智慧积累中的重要作用,并通过历史人物的例子阐述了孤独与智慧之间密不可分的联系。 首先,演讲者...

    深度学习,让小学数学计算教学落地生根.pdf

    数形结合是深度学习中常用的教学策略之一。通过将数学概念与几何图形相结合,学生能够在视觉和空间上更好地理解抽象的数学内容。比如在教授“数减一位数(退位减)”时,利用动画片的情境引导学生,将抽象的数学问题...

    让“深度学习”在初中数学中落地生根.pdf

    本文档《让“深度学习”在初中数学中落地生根》探讨了深度学习在初中数学教育中的应用,分析了深度学习的内涵和特征,并讨论了实现深度学习的影响因素和面临的难点。 深度学习最早由瑞典学者提出,并在1967年引起了...

    用深度学习让语文核心素养落地生根.pdf

    《用深度学习让语文核心素养落地生根》一文深刻剖析了如何将这一前沿技术应用在语文教育中,尤其指出了通过深度学习深入文本内涵,增强学生对文学作品的理解与鉴赏能力的重要性。文章以《游褒禅山记》为例,详细阐释...

    让“深度学习”在高中数学中落地生根.pdf

    让“深度学习”在高中数学中落地生根.pdf

    深度学习让数学核心素养落地生根.pdf

    深度学习通过将知识与技能整合到一个体系中,促使学生将新知识融入到已有的知识基础之上,形成更加系统和深刻的理解,让知识真正成为个人认知的一部分。 其次,深度学习还能促进学生的思维品质快速提高。根据布鲁姆...

    树莓组织培养生根炼苗技术.pdf

    树莓组织培养生根炼苗技术.pdf

    巧用深度学习,促核心素养生根——以苏教版小学语文教学为例.pdf

    巧用深度学习,促核心素养生根——以苏教版小学语文教学为例.pdf

    让“深度学习”在数学教学中落地生根.pdf

    生活的问题情境,引导学生通过深度学习的方式理解和应用数学...教师应不断探索和实践,将深度学习的理念融入到各个教学环节,让数学教育更加生动、有趣且富有挑战性,从而真正实现“深度学习”在数学教学中的落地生根。

    计算机应用行业:华为HMS落地生根.pdf

    综上所述,华为HMS的落地生根不仅反映了华为在面对外部环境挑战时的应对策略,也揭示了计算机应用行业在新技术、新应用趋势下的发展机会。行业分析报告为投资者提供了丰富的信息和数据支持,帮助他们了解当前的市场...

    IBA对含笑扦插生根影响初探.pdf

    因此,如何提高扦插生根率成为了相关研究领域的热点之一。 吲哚丁酸(IBA)是一种广泛用于植物组织培养和无性繁殖中的生长素,它能够促进插条的生根。在本研究中,我们重点探究了IBA处理对含笑扦插生根过程的影响,...

    深度学习:让核心素养培育落地生根——以苏教版数学五年级上册“小数乘10、100、1000……的计算规律”教学为例.pdf

    在当前教育领域,深度学习已成为一个研究的热点,尤其在数学教学中,它对于培养学生的学科核心素养具有重要作用。...只有这样,我们才能真正实现深度学习,让学生的学科核心素养在实际教学中落地生根。

    小学语文成语大全枝末生根成语解释

    【小学语文成语大全枝末生根成语解释】 成语,作为汉语语言中的精华部分,承载着丰富的文化内涵和历史智慧。在小学语文教育中,成语学习不仅丰富了学生的词汇量,更是让他们在了解中华文化的同时,学会运用这些智慧...

    拓展探究空间,促使学生的深度学习落地生根.pdf

    【深度学习】是一种教育理念,旨在引导学生深入理解科学知识,探索知识的本质,提升思维能力和问题解决技巧。这种学习方式要求学生在感知、思维、情感、意识和价值观等多个层面全面投入,强调以学生为中心,注重培养...

    冀教小学科学五年级下册落地生根PPT教案.pptx

    在"落地生根"这一单元中,我们以一些常见的例子来揭示无性生殖的神奇之处。例如,我们可能在自家的花盆里观察到,一片落地的落地生根的叶子就能在土壤中生根发芽,最终长成一株新的落地生根植物。这正是无性生殖的一...

Global site tag (gtag.js) - Google Analytics