如题,我再ios端实现了3d模型文件的展示,但是法线一问题。就是模型创造者在设计模型的时候并不一定是把模型放在坐标原点开始设计的,那么就导致我读出模型后,有的时候模型是在屏幕外边的,有的时候模型是超级大或者超级小到看不到的。那么请问,我该修改什么属性,能让它按照一定大小展示在屏幕中央呢?
下面是我的展示模型的代码。
float verxxx[]={这里有一系列三角面片数据};
glVertexAttribPointer(_positionSlot, 3, GL_FLOAT, GL_FALSE, 0, verxxx);
glEnableVertexAttribArray(_positionSlot);
GLuint buffer;
glGenBuffers(1, &buffer);
glBindBuffer(GL_ARRAY_BUFFER, buffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(verxxx), verxxx, GL_STATIC_DRAW);
// 3、将缓冲区的数据复制进通用顶点属性中
glEnableVertexAttribArray(GLKVertexAttribPosition);
glVertexAttribPointer(GLKVertexAttribPosition, 3, GL_FLOAT, GL_FALSE, 4*8, (char *)NULL + 0); //读顶点坐标
//4、继续复制其他数据
// 在前面预定义的顶点数据数组中,还包含了法线和纹理坐标,所以参照上面的方法,将剩余的数据分别复制进通用顶点属性中。
glEnableVertexAttribArray(GLKVertexAttribNormal);
glVertexAttribPointer(GLKVertexAttribNormal, 3, GL_FLOAT, GL_FALSE, 4*8, (char *)NULL +12); //读法线
glEnableVertexAttribArray(GLKVertexAttribTexCoord0);
glVertexAttribPointer(GLKVertexAttribTexCoord0, 2, GL_FLOAT, GL_FALSE, 4*8, (char *)NULL + 24); //读纹理
glDrawArrays(GL_TRIANGLES, 0, sumFloat.count/7);
glDeleteBuffers(1, &buffer);
指点一下,谢谢
解决了,我最后根据模型文件中所有的顶点数据,去到了最大和最小的xyz值,根据xyz值求出模型的中心点坐标,然后根据比例将模型在(0.0.0)处重绘即实现了模型在屏幕中心显示。至于合适大小,则是求出模型的最大长径,然后根据这个模型的长径求出一个在屏幕上合适的比例。将所有的xyz值乘以此比例。。。。完美解决。希望有人能够用到!