顶点坐标

Unity中创建Mesh

匿名 (未验证) 提交于 2019-12-02 23:51:01
什么是Mesh? Mesh是指的模型的网格,3D模型是由多边形拼接而成,而多边形实际上又是由多个三角形拼接而成的。即一个3D模型的表面其实是由多个彼此相连的三角面构成。三维空间中,构成这些三角形的点和边的集合就是Mesh。 原理 即动态创建一个Mesh,设置三角形和顶点数据,然后赋值给MeshFilter(增加mesh属性),通过MeshRenderer(增加材质并渲染出Mesh)绘制出来 Mesh的组成部分 1.vertices(顶点数据数组Vector3[]) 2.triangles(三角形顶点索引数组,int[]) 3.normals(法线向量数组,Vector3[]) 4.uv(纹理坐标数组,Vector2[]) 顶点坐标 :顶点坐标数组存放Mesh的每个顶点的空间坐标,假设某mesh有n个顶点,则vertex的size为n 法线 :法线数组存放mesh每个顶点的法线,大小与顶点坐标对应,normal[i]对应顶点vertex[i]的法线 纹理坐标 :它定义了图片上每个点的位置的信息. 这些点与3D模型是相互联系的, 以决定表面纹理贴图的位置. UV就是将图像上每一个点精确对应到模型物体的表面. uv[i]对应vertex[i] 三角形序列 :每个mesh都由多个三角面组成,而三角面的三个点就是顶点坐标里的点,三角形的数组的size = 三角形个数 * 3 创建一个立方体

OpenGL(6)――坐标系

匿名 (未验证) 提交于 2019-12-02 23:45:01
在掌握基本变换后,学习如何变换coordinate space。 对coordinate space进行变换的目的是将local space中各顶点坐标转换成normalized device coordinate (NDC),然后传递到Fragment Shader中。对于OpenGL,为了能够最终显示在屏幕上,被转换成NDC的顶点坐标的x、y和z坐标范围应当在[-1, 1],并遵循左手坐标系原则,即坐标范围超出[-1, 1]顶点,均是不可见的。coordinate space变换的步骤如下图所示: 记住五个坐标系和三个矩阵!在编写程序时,也是对这三个矩阵进行操作。分别解释它们的作用: 1. model matrix model matrix将local coordinate变换为world coordinate。想象一个等边三角形,在最开始它处于local space,坐标系原点就是三角形的中心点。当渲染多个等边三角形时,对于每个处于local space的三角形来说,坐标系原点均是自身的中心点。在对三角形进行scale、rotate和translate后,三角形被分散在了各处,并处在world space中,此时需要一个新的坐标系来表示各三角形的顶点坐标,即world coordinate。也很容易看出,在这个例子中,model matrix就是对三角形进行scale

OpenGL ES 入门

匿名 (未验证) 提交于 2019-12-02 23:43:01
记录一下 OpenGL ES Android 开发的入门教程。逻辑性可能不那么强,想到哪写到哪。也可能自己的一些理解有误。 参考资料: LearnOpenGL CN Android官方文档 《OpenGL ES应用开发实践指南Android卷》 《OpenGL ES 3.0 编程指南第2版》 目前android 4.3或以上支持opengles 3.0,但目前很多运行android 4.3系统的硬件能支持opengles 3.0的也是非常少的。不过,opengles 3.0是向后兼容的,当程序发现硬件不支持opengles 3.0时则会自动调用opengles 2.0的API。Andorid 中使用 OpenGLES 有两种方式,一种是基于Android框架API, 另一种是基于 Native Development Kit(NDK)使用 OpenGL。本文介绍Android框架接口。 本文写一个最基本的三角形绘制,来说明一下 OpenGL ES 的基本流程,以及注意点。 <!-- Tell the system this app requires OpenGL ES 3.0. --> <uses-feature android:glEsVersion="0x00030000" android:required="true" /> 如果程序中使用了纹理压缩的话,还需进行如下声明

Triangulation by Ear Clipping(耳切法处理多边形三角划分)(转载)

℡╲_俬逩灬. 提交于 2019-12-02 16:08:46
转载自: https://www.cnblogs.com/xignzou/p/3721494.html 使用EarClipping三角化多边形(翻译) ---Triangulation by Ear Clipping( http://www.geometrictools.com/Documentation/TriangulationByEarClipping.pdf ) 内容提要 1、简介 2、Ear Clipping方法 3、含有岛洞的多边形 4、查找相互可见点 5、含有多个岛洞的多边形 6、嵌套多边形 1、简介 将简单多边形转换成一组由同样顶点组成的三角形集合是计算机图形学中的一个经典问题。问题中,简单多边形是指由一组有序顶点组成的,点V0~点Vn-1。相邻的顶点之间通过边(Vi, Vi-1)连接,并且边(Vn-1,V0)连接起始点。每个顶点被两条边所共享,而边的所有交点都是顶点。图1.1的示例则是说明 图中,左边的多边形是个简单多边形,中间的多边形点1被四条边共享,不符合定义的条件,不算是简单多边形,右侧的多边形中边14,边02的交点不是我们定义的顶点之一,因此该图形也不符合简单多边形的定义。 图1.1 简单多边形示例 如果一个多边形是简单多边形,当你延长一条边的时候,内部有界区域中总是在边的一侧。假设多边形顶点逆时针排序,那么当你延长边的时候,内部指的便是你的左边。

UnityShader 语义、内置文件、变量

梦想的初衷 提交于 2019-12-01 07:25:36
内置文件 cgnic name Describe UnityCG.cginc ,包含了最常用变量、帮助函数、宏、结构体 Lighting.cginc 各种内置的光照模型,表面着色器会自动包含该文件 HLSLSupport.cginc 声明了许多用于跨平台编译的宏和定义 UnityGlobalIllumination.cginc 全局光照 内置常用结构体 struct name include variables appdata_base 顶点位置、顶点法线、第一组纹理坐标 appdata_tan 顶点位置、顶点切线、顶点法线、第一组纹理坐标 appdata_full 顶点位置、顶带你切线、顶点法线、四组纹理坐标 appdata_img 顶点位置、第一组纹理坐标 v2f_img (用于顶点着色器输出),裁剪空间位置、纹理坐标 内置变换矩阵 matraix name Describe UNITY_MATRIX_MVP 当前的模型·观察·投影矩阵,用于将顶点方向矢量从模型空间变换到裁剪空间 UNITY_MATRIX_MV 当前的模型·观察矩阵,用于将顶点方向矢量从模型空间变换到裁剪空间 UNITY_MATRIX_V 当前的观察矩阵,用于将顶点方向矢量从世界空间变换到观察空间 UNITY_MATRIX_P 当前的投影矩阵,用于将顶点方向矢量从观察空间变换到世界空间 UNITY_MATRIX

OpenGL中一种高效的线段反走样技术

↘锁芯ラ 提交于 2019-11-30 11:21:39
令人讨厌的“走样” 我在日常工作中通过传统的OpenGL绘制函数绘制线段时,发现绘制出的线段边缘充满了“锯齿”,而这种“锯齿”在线段运动和旋转时往往会更加明 显(图 1)。这种我们不希望看到的“锯齿”被成为“走样”,而消除这种“锯齿”的过程就是我们所说的“反走样”。虽然OpenGL提供了诸如设置 GL_LINE_SMOOTH 属性、多重采样等线段反走样的方法,但效果和质量受到很多方面的限制,而且不同的硬件厂商使用不同的反走样算法,所以使得反走样的结果在不同的GPU上有 着不同的效果。因此我们需要一种更为高效和通用的线段反走样技术。 图1 采用传统OpenGL绘制方法绘制的线段 为什么会“走样”? 在介绍如何对线段反走样之前,我们必须了解为什么我们绘制的线段会产生“走样”。 我们都知道,在数学的定义中一条线段是由两个端点确定的,而线段是没有宽度和面积的。但在计算机图形领域中,为了让人的肉眼能够看到,必须给线段 一定的宽 度,所以我们的线段通常是由两个端点和一个宽度参数确定的,而我们计算机中图形的宽度通常都是以像素为单位的,因此我们的线段宽度有可能是1像素也有可能 是n像素。 如果需要在白色的背景下绘制一条宽度为1像素的黑色线段,从信号处理的观点上来看,我们可以把这条线段看做一个值为1的信号,而线段外部的区域信 号值为0,如果不加任何处理,线段的边界就是这样一个不连续的阶梯函数(图2)

obj + mtl 格式说明

怎甘沉沦 提交于 2019-11-30 00:20:19
OBJ(或 .OBJ)是一种开放的几何定义文件格式,最初由Wavefront Technologies公司开发,用以描述其Advanced Visualizer动画包。该格式已被其他3D图形应用供应商采纳,是一种被绝大多数普遍公认的格式。 OBJ文件格式为简单数据格式,它仅表现3D几何体,即顶点的位置、以顶点列表方式定义每个多边形的顶点、法向量和面的UV坐标,以及纹理顶点。顶点默认以逆时针方向存储,不必显式声明法向。 1. 文件格式 注释行以#号起首 # 这是注释 一个OBJ文件包含几类定义: # 顶点列表,用(x,y,z[,w])坐标表示,w为可选 v 0.123 0.234 0.345 1.0 v ... ... # 纹理坐标,用(u,v[,w])坐标表示,w为可选 vt 0.500 -1.352 [0.234] vt ... ... # 法向量,用(x,y,z)的形式,法向量非单位向量 vn 0.707 0.000 0.707 vn ... ... # 面的定义详见下 f 1 2 3 f 3/1 4/2 5/3 f 6/4/1 3/5/3 7/6/5 f ... ... 2. 面的定义 面通过顶点列表、纹理及法向的索引来定义。定义多边形(诸如四边形)时可超过三张顶点/纹理/法向索引。OBJ文件也支持自由曲面,如NURB(非均匀有理B样条)。 有多种方式定义一个面

数据结构学习第十七天

随声附和 提交于 2019-11-29 03:34:12
14:39:22 2019-09-01 学习 图的两种遍历方法: ①DFS 深度优先搜索(Depth First Search) ②BFS 广度优先搜索(Breadth First Search) //利用队列实现广度优先 //邻接表实现 及 利用 邻接表 实现 深度优先搜索(DFS) 1 #define _CRT_SECURE_NO_WARNINGS 2 #include<stdio.h> 3 #include<malloc.h> 4 //表示图的两种方法 5 //邻接矩阵 G[N][N] N个顶点从0到N-1编号 6 //邻接表 表示 7 /*Graph Create(); //建立并返回空图 8 Graph InsertVertex(Graph G, Vertex v); //将v插入G 9 Graph InsertEdge(Graph G, Edge e); //将e插入G 10 void DFS(Graph G, Vertex v); //从顶点v出发深度优先遍历图G 11 void BFS(Graph G, Vertex v); //从顶点v出发宽度优先遍历图G 12 void ShortestPath(Graph G, Vertex v, int Dist[]); //计算图G中顶点v到任意其它顶点的最短距离 13 void MST(Graph G); /

【OpenGL编程】拖尾、刀光、剑光、尾焰效果的开发

二次信任 提交于 2019-11-29 02:45:27
重要 为了方便大家共同交流学习,我对模块进行了升级,现在为Version 2。Version 2版本按照Google C++编程规范修改了部分注释和变量名称,建议大家去我的GitHub去查看,本文章的算法部分还是可以借鉴的。改动具体如下。 1、添加详细类注释,概括类的功能。 2、修改了部分变量名称。 3、 升级项目环境为Android Studio 3.2,原版本为2.2,已经淘汰。 说在开始 最近模拟了切水果里面的拖尾效果,其可以应用在许多的场景里面,例如,武器的刀光,飞机的尾焰效果等等。我开发的这个Demo是基于OpenGL ES的,开发环境(IDE)使用的Android Studio。如果想让案例使用在其他平台,还需要借鉴本节的算法自己开发,如果是OpenGL或者OpenGL ES的话,直接就可以使用。(当然也需要适当的修改的)。 代码位置 我把我的Demo都放在我的github上,如果对您有帮助还希望您能帮我点一个star。 https://github.com/ModestBean/MyStreak 谢谢。本人的知识有限,如果本节内容有错误和不合理之处,还请朋友们多多指出,我会虚心接受每一个建议。 运行效果 当然我触控的方法都是基于Android的触控写的。 原理部分 其算法与cocos的的MotionStreak类似。 OpenGL ES中有三种基本的图元,点线和三角形

Mesh网格简化

怎甘沉沦 提交于 2019-11-29 02:35:23
Mesh简化算法: 1. 通过mesh简化,可以将一个多边形的网格A转化成另一个网格B 网格B相比A,有更少的三角形面、边、顶点。 2. 简化的过程是受到一定的约束的。会有一系列自定义的质量标准来控制简化的进行。这些质量标准是为了让简化后的网格尽可能和原来的网格有相差不大的质量。 3. Mesh简化往往都是迭代的,例如每一次移除一个顶点或者一条边。并且这一过程是可以反转的,也就是可以通过优化后的网格,恢复到原网格 主要的简化算法: 1. 顶点聚集(Vertex Clustering)。 按照我自己的理解大致概述下,就是将距离 (记作ε )一定范围内的顶点合并成一个代表顶点。 这种处理方式速度快,时间复杂度是O(n),n是顶点数量。(暂留疑问为什么是O(n)) 当然缺陷也很明显,可能会出现一个三角形退化成一条线段甚至一个顶点的情况。 a) 聚集生成(Cluster Generation) 用一个大的方框囊括mesh,然后将这个大方框分割成一个个小空间(cells),确定一个数值 ε > 0,作为小空间的边长。然后将mesh映射到这个方框里 (上图白点黑线是原mesh,绿点是简化后的mesh顶点) b) 选择代表顶点(Representative Vertex) 就是将一个小空间里的所有顶点合并,选一个代表顶点来表示(这个代表顶点不一定是原mesh中存在的顶点) 第一种选择方法:平均值