顶点坐标

OpenGL--骨骼动画

一笑奈何 提交于 2020-03-18 14:46:27
理论基础 骨骼蒙皮动画其实现类似人体模型,由节点(关节)树构成,节点间通过骨骼连接,每块骨骼至多一个父节点,父节点带动子骨骼运动。具体是关节带动其对应子骨骼运动从而牵动绑定到其上的皮肤变化。骨骼是刚体不会变形,只能绕父节点旋转(构造前面章节有提–3D世界实现中的机器人手臂例子,早期的骨骼动画就是这样,不过在关节处会有明显裂缝,所以才引出现在的蒙皮概念)。而绑定到其上的皮肤顶点则是实时变换拉伸的,变换大体就是通过一些矩阵的操作来最终计算出新顶点坐标等信息,再根据这些新顶点信息进行渲染,即通过更新顶点,渲染这样不断循环形成动画。 实现步骤总结: 一,根据更新前后两个关键帧的时间值插值计算出该时刻骨骼相对于其父骨骼的新变换矩阵–骨骼顶点信息。(本实例由于是手动控制动作,直接由变化的x,y计算) 二,再计算皮肤顶点信息,首先找到影响其顶点的所有骨骼,然后计算每一骨骼对该顶点的影响,即计算出在每个独立骨骼作用下顶点的新位置。公式如下: 最后将所有这些新位置按照每一骨骼的影响权重加权求和,得到皮肤顶点信息。 三,根据这些顶点信息进行绘制。 说明: 1,我们通常会把每个关节赋予一个索引值标志,无论是储存空间上还是查找时间上,都比直接使用关节名高效得多。因为每个关节有且仅有一个父关节,只要在每个关节储存其父关节的索引,即能表示整个骨骼结构。由于根关节无父,所以其索引通常会设为无效的索引,如-1。

MD5骨骼动画模型加载

萝らか妹 提交于 2020-03-14 15:12:33
前面我们分析了静态模型OBJ格式,桢动画模型MD2,这篇主要分析骨骼动画MD5的一些概念并且实现。   混合桢动画有计算简单,容易实现等优点,但是在需要比较细致的效果时,则需要更多的关键桢,每桢都添加相同的顶点,如果模型再细分一些,则比较恐怖了。在这基础上,则发展出了骨骼动画模型,原理说起来很简单,比如我们人类,做的各种动作具体都是由几个关节点来控制,比如你抬腿,你只把你大腿的骨骼调动起来,而大腿的肌肉跟着骨骼向上。由些我们只需要保存每桢的骨骼变动,然后再上面蒙上表皮。因此大量简单了顶点存储,并且,我们能方便的对骨骼实时改动就能添加不同的动画,但是因为骨骼的改变都是针对父骨骼来的,而蒙皮操作又是针对骷髅节点来做的,这些操作需要大量的运算。   下面我们来解析MD5骨骼模型中,一些基本的概念与实现,在MD5,除去纹理图片,有二个比较主要的文件,一个是后缀为md5mesh的文件,一个是后缀为md5anim的文件,二个文件如他们的后缀名所表达的意思一样,前者和OBJ模型里的描述比较类似,主要包含每部分的顶点,面,纹理组成,不同于OBJ模型的的,这些元素是变化的,因此在OBJ模型有一些新的元素,如顶点不是单独的顶点,而是由一个或多个权重点构成,每个权重点关联着对应着骨骼节点,这样骨骼节点的改变能引起权重点的改变,而权重点的改变又引起了顶点的改变,至于为什么要用到权重点来连接骨骼和顶点

Esfog_UnityShader教程_前言

[亡魂溺海] 提交于 2020-03-12 03:25:39
   很多人在学习Unity的时候对Shader都是一知半解,作为刚入职半年的新人接触Shader的时间也并不长,正因为是新人才能体会到学习Shader时候所遇到的困难和迷茫,无奈于资料不好找,网上难得的几篇教程讲的又不够完善或者太浅太短,所以我一直以来就想写一系列UnityShader的学习教程,现在终于快过年公司放假了, 抽空准备开始着手写这个系列的教程了,在Unity这个圈子里我还是一只很菜很菜的菜鸟,感谢这半年来一路上帮助过我的人,书,以及在网上无私奉献宝贵知识的前辈们,仅以此系列向他们致敬.   这个系列的教程会不定期的更新,由于笔者工作繁忙,有时可能会一段时间不更新,还望各位谅解,本人才疏学浅,可能在大神们面前班门弄斧了,写这系列教程一来是想帮助那些准备接触Shader却不知如何入门的同学们分享自己的经验,二来是借由自己写教程来锻炼自己写技术文章的文笔和巩固自己学习的知识,查缺补漏,只有你能把你学到的知识透彻的讲给别人听的时候,你才完全掌握了它.由于我接触Unity时间并不长,接触Shader时间更短,难免会有所纰漏和错误,还望各位看官不吝赐教,批评指正. 前言    前言部分主要是讲述一下个人对学习UnityShader的一些建议,以及描述一下图形渲染的大概模型和UnityShader的工作方式.   首先要说明一点

【转】光栅化操作阶段

被刻印的时光 ゝ 提交于 2020-03-06 11:41:48
1.从顶点处理进入硬件处理阶段,在这里,先将顶点组装成图元,再将各个图元光栅化为片元集合。 2.光栅化过程:剪裁操作、透视除法、背面剔除操作、视口转换已经扫描转换。 3.剪裁操作:三角形与视椎体空间关系三种。 4.透视除法:投影转换生成齐次剪裁空间内的顶点。各顶点初一自身的w坐标后将齐次坐标转换成笛卡尔坐标,该过程将生成透视效果,因此成为透视除法。就是Mproj矩阵跟所有顶点相乘。 5.背面剔除:相机与该顶点的v和该顶点的法线n的点积。n.v=|||n|||v||cos@>0 ; n.v<0; n.v=0; OpenGL和Direct3D都提供了函数来完成背面剔除操作。 6.3dsMax至OpenGL:翻转坐标轴 OpenGL至Direct3D:反射,顶点重排列 7.视口转换:即定义了左上角的x,y,长宽w,h,z的maxz ,minz 8.扫描转换:处理顶点属性(法线、纹理坐标、颜色值),两个顶点颜色插值计算出其他像素的颜色(左上原则) 来自: http://blog.sina.com.cn/s/blog_aa5f606d0102w0bl.html 来源: https://www.cnblogs.com/timeObjserver/p/12425173.html

为什么要使用指针? [关闭]

随声附和 提交于 2020-03-01 22:20:05
我知道这是一个非常基本的问题,但是在使用高级语言编写了一些项目之后,我才开始进行一些基本的C ++编程。 基本上我有三个问题: 为什么在普通变量上使用指针? 我应该在何时何地使用指针? 如何将指针与数组一起使用? #1楼 在变量上使用指针的一种方法是消除所需的重复内存。 例如,如果您有一些大型的复杂对象,则可以使用指针为您所做的每个引用指向该变量。 使用变量,您需要为每个副本复制内存。 #2楼 在某些情况下,需要使用函数指针才能使用共享库(.DLL或.so)中的函数。 这包括跨语言执行操作,通常会提供DLL接口。 制作编译器 做科学的计算器,在哪里有函数指针的数组或向量或字符串映射? 尝试直接修改视频内存-制作自己的图形包 制作一个API! 数据结构-您正在制作的特殊树的节点链接指针 指针有很多原因。 如果您想保持跨语言兼容性,则在DLL中进行C名称处理尤其重要。 #3楼 这是我的助手,我不会答应成为专家,但是我发现指针在我要编写的其中一个库中很棒。 在这个库中(这是带有OpenGL的图形API :-),您可以创建一个三角形,并向其中传递顶点对象。 draw方法采用这些三角形对象,并根据我创建的顶点对象来绘制它们。 好吧,没关系。 但是,如果我更改顶点坐标怎么办? 用顶点类中的moveX()移动它还是其他东西? 好吧,好的,现在我必须更新三角形,添加更多的方法,并且浪费了性能

[Noip模拟赛] Polygon

自古美人都是妖i 提交于 2020-03-01 11:42:14
POLYGON 源程序名 POLYGON.??? ( PAS , C , CPP ) 可执行文件名 POLYGON.EXE 输入文件名 POLYGON.IN 输出文件名 POLYGON.OUT 对于一个多边形来说,在该多边形内任取两点,如果这两点连成的线段落在多边形内,则称这样的多边形为凸多边形。 平面上有N个坐标值为自然数的圆点。顶点数最多凸多边形是指由给定的圆点中的一部分组成的凸多边形,它包含最大可能的顶点数。原点,即坐标内中心(0,0)必须是顶点数最多凸多边形的一个顶点。 编写程序求出这样的凸多边形的最大顶点数。注意一个多边形的连续的边不能是平行的。 输入 输入文件的第一行包含一个自然数N,2≤N≤100,表示给定的圆点数。 下面的N行每行包含两个用空格隔开的自然数X和Y,1≤X≤100,1≤Y≤100,表示一个圆点的坐标值。所有的圆点是不相同的。 输出 输出文件的第一行也是唯一的一行应该包含顶点数最多凸多边形的顶点数。注意结果应不小于3。 样例 POLYGON.IN 8 10 8 3 9 2 8 2 3 9 2 9 10 10 3 8 10 POLYGON.OUT 8 【题解】 有点坑。。第一眼看成求凸包顶点数了结果竟然还有50分= = 然后后面想了半天不会做 然后呢想了半天发现设f[i,j]表示最后两个点为i和j的情况下凸多边形最大顶点数 那么枚举k [1...i-1

OpenGL超级宝典笔记——新的模式

▼魔方 西西 提交于 2020-02-28 19:51:52
在传统上,图形硬件设计的目标是快速地执行相同的硬编译的计算指令集。计算的步骤可以被跳过,参数可以被调整,但计算本身却是固定的。所以旧式的GPU设计被称为是“固定功能”的。现在的趋势是朝着通用图形处理器的方向发展。就像CPU一样,GPU也可以用任意的指令序列来执行图形计算。GPU和CPU最大的区别是,GPU的浮点数计算能力更强。 在OpenGL2.0之前是固定函数渲染管线,在OpenGL2.0之后就是可编程函数渲染管线了。 走出旧的模式 在替换掉旧的模式之前,我们来回顾一下传统的OpenGL渲染管线是如何运作的。在第一阶段的是基于顶点操作,然后是图元的光栅化产生片段,最后在写到帧缓冲区前,执行片段的纹理,雾和其他的操作。如下图,下面分别讨论基于顶点和基于片段的操作。 固定的顶点处理 基于顶点的阶段以一系列顶点的属性作为输入。这些输入包括物体空间坐标,法线,主颜色,辅助颜色,纹理坐标。最终处理输出的结果为裁剪空间坐标,正面和背面的主颜色和辅助颜色,雾坐标,纹理坐标,以及点的大小。这个处理过程被分为四个阶段。 顶点变换 在传统的固定函数管线中,顶点坐标从物体空间转换到裁剪空间。首先乘以模型视图矩阵转换到视觉空间,然后再乘以投影矩阵变换到裁剪空间。与者两个矩阵相乘是固定的程序,要“跳过”这个过程,就是把这两个矩阵都通过glLoadIdentity设置为单位阵。这样就不会产生影响

OpenGL ES学习笔记(三)——纹理

此生再无相见时 提交于 2020-02-28 12:40:25
首先申明下,本文为笔者学习《OpenGL ES应用开发实践指南(Android卷)》的笔记,涉及的代码均出自原书,如有需要,请到原书指定 源码地址 下载。 《 OpenGL ES学习笔记(二)——平滑着色、自适应宽高及三维图像生成 》中阐述的平滑着色、自适应宽高是为了实现在移动端模拟真实场景采用的方法,并且通过w分量增加了三维视角,在具体实现上采用了正交投影、透视投影的理论。本文将在此基础上,构建更加精美的三维场景。三维效果本质上是点、直线和三角形的组合,纹理是将图像或者照片覆盖到物体表面,形成精美的细节。在实现上具体分为两步:1)将纹理图片加载进OpenGL;2)OpenGL将其显示到物体表面。(有点像把大象装进冰箱分几步~~~)不过,在实现过程中,涉及到着色器程序的管理,涉及到不同的纹理过滤模式,涉及到顶点数据新的类结构等问题,下面将一一对其阐述: 纹理加载 纹理着色器 更新顶点数据类结构 着色器程序类 纹理绘制 一、纹理加载 将纹理覆盖到物体表面,最终是通对齐坐标来实现的。而OpenGL中二维纹理的坐标与计算机图像的坐标并不一致,因此,首先对比下两者的不同。 可见,两者的差别在于绕横轴翻转180度。另外,OpenGL ES支持的纹理不必是正方形,但每个维度都必须是2的幂。 加载纹理图片的方法参数列表应该包括Android上下文(Context)和资源ID

VAO与VBO

限于喜欢 提交于 2020-02-28 07:13:56
  如果你也逐渐步进GL3.0开始的新标准,你大概会留意到传统的绘图方式(glVertex)已经要被废掉了,不仅如此,以最高绘制速度为标记的显示列表方式也已经被印上deprecated了,这样,在以前的文章([ 学一学,VBO ] )中的讨论,在新标准的面前都显得没什么必要了。我想说的是,OpenGL对GPU的入口“顶点传送”——或者说,绘制方式,尽量不要再选择传统方式(glVertex)或显示列表(glCallList)甚至VA(vertex array)了。哪怕你是用的一个compatable的GL-context,哪怕顶点数据部分持续变化或者恒定不变,也得注意要尽量尽量使用VBO来组织你的数据。   另外的一点,就是尽量不要以客户端状态函数来使用VBO了。我是说——glEnableClientState/glDisableClientState,还有glVertexPointer这类函数。VBO的本意是把本地(GL客户端)的数据完全交给GPU(GL服务端)来管理,所以若非为了数据的更新,你完全可以在调用glBufferData之后选择扔弃保存在本地内存中的数据。VBO可以说只有在传输数据的时候跟本地客户端有联系,它的状态是服务端(我们的流水线)管理的,当初沿用VA的那些客户端状态函数,还有一个原因就是它们方便地与shader里面的固定attribute(gl

计算几何

醉酒当歌 提交于 2020-02-27 09:13:57
矢量的概念 :如果一条线段的端点是有次序之分的,我们把这种线段成为有向线段(directed segment)。如果有向线段p1p2的起点p1在坐标原点,我们可以把它称为矢量(vector)p2。 矢量加减法 :设二维矢量P = ( x1, y1 ),Q = ( x2 , y2 ),则矢量加法定义为: P + Q = ( x1 + x2 , y1 + y2 ),同样的,矢量减法定义为: P - Q = ( x1 - x2 , y1 - y2 )。显然有性质 P + Q = Q + P,P - Q = - ( Q - P )。 矢量叉积 :计算矢量叉积是与直线和线段相关算法的核心部分。设矢量P = ( x1, y1 ),Q = ( x2, y2 ),则矢量叉积定义为由(0,0)、p1、p2和p1+p2所组成的平行四边形的带符号的面积,即:P × Q = x1*y2 - x2*y1,其结果是一个标量。显然有性质 P × Q = - ( Q × P ) 和 P × ( - Q ) = - ( P × Q )。一般在不加说明的情况下,本文下述算法中所有的点都看作矢量,两点的加减法就是矢量相加减,而点的乘法则看作矢量叉积。 【叉积的一个非常重要性质是可以通过它的符号判断两矢量相互之间的顺逆时针关系】 1)若 P × Q > 0 , 则P在Q的顺时针方向。 2)若 P × Q < 0 ,