早教吧作业答案频道 -->其他-->
自己写的顶点法线计算器,传入顶点和索引数组,结果存放在传入的法线数组中.基本思路是按顶点编号遍历,看索引中如果有相同的顶点,就计算所在三角形的面法向量,最后把所有共面法向量相
题目详情
自己写的顶点法线计算器,
传入顶点和索引数组,结果存放在传入的法线数组中.基本思路是按顶点编号遍历,看索引中如果有相同的顶点,就计算所在三角形的面法向量,最后把所有共面法向量相加求平均.因为看过一个资料说法向量和面积成正比所以没有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-05-22 …
水尺编号中,支号用于区别()的位置。A、同一组水尺在不同断面B、同一组水尺在本断面C、不同一组水 2020-05-27 …
用VB编程.输入30位同学的编号和成绩,求他们的平均成绩,并输出高于平均分的同学编号和成绩……用V 2020-06-14 …
1988名同学按编号从小到大顺次排成一列,令奇数号位(1号位,3号位…)上的同学离队,余下的同学顺 2020-06-14 …
第一题:200名同学编为1至200号面向南站成一排,第一次全体同学向右转(转后所有同学面向朝西); 2020-06-18 …
如图所示,为“曾侯乙编钟”,用钟锤敲击编钟,轻敲或重敲同一只编钟所发出声音的不同;用相同的力敲大小 2020-07-07 …
小杰买了一本共有100张纸的练习本,并依次将它的各面编号(即由第一面一直编到第200面)小丽从该练 2020-07-13 …
在java中如果同一个包中父类在a.java中,子类在b.java中,编译时已成功编译父类,为何子 2020-07-17 …
商品房面积比超怎么算在商品房销售合同中面积误差比绝对值在3%以外的,预购人有权退房.这3%怎能么算 2020-07-18 …
在编梁的编号时,什么情况下可以用相同的编号?一定要截面,配筋,跨度,跨数都相同才能用同一个编号吗 2020-11-16 …