早教吧作业答案频道 -->其他-->
自己写的顶点法线计算器,传入顶点和索引数组,结果存放在传入的法线数组中.基本思路是按顶点编号遍历,看索引中如果有相同的顶点,就计算所在三角形的面法向量,最后把所有共面法向量相
题目详情
自己写的顶点法线计算器,
传入顶点和索引数组,结果存放在传入的法线数组中.基本思路是按顶点编号遍历,看索引中如果有相同的顶点,就计算所在三角形的面法向量,最后把所有共面法向量相加求平均.因为看过一个资料说法向量和面积成正比所以没有normalize.但是结果却很不理想,float[] vertices = {...};short[] indices = {...};float[] normals = new float[vertices.length];// 存放normals的数组,大小与顶点数组一致private void prepareNormals(float[] vertices,short[] indices,float[] normals) { int numofIndices = indices.length;// 索引数 int numofVertices = vertices.length / 3;// 顶点数量 int numofTriangles = numofIndices / 3;// mesh的三角形数量 int temp0,temp1,temp2,numofPlane; // 3个临时变量等下做数组下标减少计算量 float px,py,pz,qx,qy,qz;// 用于计算单位三角形面法线的两个向量 for (int i = 0; i < numofVertices; i++) { numofPlane = 0;//重置共面数量 for (int j = 0; j < numofTriangles; j++) { temp0 = j * 3; temp1 = j * 3 + 1; temp2 = j * 3 + 2; if (indices[temp0] == i || indices[temp1] == i || indices[temp2] == i) { numofPlane++;//如果找到,共面+1 px = vertices[indices[temp1] * 3] - vertices[indices[temp0] * 3]; py = vertices[indices[temp1] * 3 + 1] - vertices[indices[temp0] * 3 + 1]; pz = vertices[indices[temp1] * 3 + 2] - vertices[indices[temp0] * 3 + 2]; qx = vertices[indices[temp2] * 3] - vertices[indices[temp0] * 3]; qy = vertices[indices[temp2] * 3 + 1] - vertices[indices[temp0] * 3 + 1]; qz = vertices[indices[temp2] * 3 + 2] - vertices[indices[temp0] * 3 + 2]; normals[i] += py * qz - pz * qy; normals[i + 1] += pz * qy - px * pz; normals[i + 2] += px * qy - py * qx; } } normals[i] /= numofPlane; normals[i + 1] /= numofPlane; normals[i + 2] /= numofPlane; } }
传入顶点和索引数组,结果存放在传入的法线数组中.基本思路是按顶点编号遍历,看索引中如果有相同的顶点,就计算所在三角形的面法向量,最后把所有共面法向量相加求平均.因为看过一个资料说法向量和面积成正比所以没有normalize.但是结果却很不理想,float[] vertices = {...};short[] indices = {...};float[] normals = new float[vertices.length];// 存放normals的数组,大小与顶点数组一致private void prepareNormals(float[] vertices,short[] indices,float[] normals) { int numofIndices = indices.length;// 索引数 int numofVertices = vertices.length / 3;// 顶点数量 int numofTriangles = numofIndices / 3;// mesh的三角形数量 int temp0,temp1,temp2,numofPlane; // 3个临时变量等下做数组下标减少计算量 float px,py,pz,qx,qy,qz;// 用于计算单位三角形面法线的两个向量 for (int i = 0; i < numofVertices; i++) { numofPlane = 0;//重置共面数量 for (int j = 0; j < numofTriangles; j++) { temp0 = j * 3; temp1 = j * 3 + 1; temp2 = j * 3 + 2; if (indices[temp0] == i || indices[temp1] == i || indices[temp2] == i) { numofPlane++;//如果找到,共面+1 px = vertices[indices[temp1] * 3] - vertices[indices[temp0] * 3]; py = vertices[indices[temp1] * 3 + 1] - vertices[indices[temp0] * 3 + 1]; pz = vertices[indices[temp1] * 3 + 2] - vertices[indices[temp0] * 3 + 2]; qx = vertices[indices[temp2] * 3] - vertices[indices[temp0] * 3]; qy = vertices[indices[temp2] * 3 + 1] - vertices[indices[temp0] * 3 + 1]; qz = vertices[indices[temp2] * 3 + 2] - vertices[indices[temp0] * 3 + 2]; normals[i] += py * qz - pz * qy; normals[i + 1] += pz * qy - px * pz; normals[i + 2] += px * qy - py * qx; } } normals[i] /= numofPlane; normals[i + 1] /= numofPlane; normals[i + 2] /= numofPlane; } }
▼优质解答
答案和解析
建议:1.设计一个合理的数据结构,方便计算,比如设计顶点的结构Point{顶点索引、邻接面等}2.计算每个顶点法线(简单的邻接面法线均值;邻接面法线根据面积均值;奇异面特殊处理的法线均值等)不过你的思路也没错,具体细节,我没看~ 查看原帖>>
看了 自己写的顶点法线计算器,传入...的网友还看了以下:
从一个角的顶点引这个角所在平面的斜射线,使斜涉线和这个角的两边的夹角相等从一个角的顶点引这个角所在平 2020-03-30 …
由椭圆b^2*x^2+a^2*y^2=a^2*b^2(a>b>0)的顶点B(0,-b)引一条弦BP 2020-04-05 …
如果我们将树的顶芽去掉后,树的顶部很难再生长,你猜猜,芽中含有()A.保护组织B.分生组织C.营养 2020-05-04 …
如果将树的顶芽去掉,树的顶端很难生长,主要原因是破坏了()A.上皮组织B.分生组织C.营养组织D. 2020-05-04 …
6个面积为1的小正方形组成长方形,点A,B,C,D,E,F,G是小正方形的顶点如图所示为由6个面积 2020-05-13 …
已知二次函数图像y=x^-mx+2m-4.如果该抛物线与X轴的两个交点及抛物线的顶点组成一个等边三 2020-05-13 …
求三角形面积的最小值一个90°角内部一点,到角的两边距离分别是3和5,过该点的直线和角的两边分别相 2020-05-20 …
聚簇索引是指索引项的顺序与表中记录的物理顺序一致的索引组织,在一个基本表上最多只能建立、【】个 2020-05-23 …
聚簇索引是指索引项的顺序与表中记录的物理顺序一致的索引组织,在二个基本表上最多只能建立【】个 2020-05-23 …
精馏操作中,若回流比增加,则( )。A.塔顶轻组分含量升高、塔顶温度上升B.塔顶组分变重、塔压升高C 2020-05-31 …