opengl帮助库glu里有一个对象叫做二次几何体,可以用来给球体圆锥体建模,然而在opengles中不能使用glu库,那么我们只能自己写方法替代它了,上次给球体建了模,这次应该给圆锥体建模了.
圆锥体是平面上的一个圆以及它的所有切线和平面外一点确定的平面围成的几何体,圆被称为底面,顶点被称为尖端,定义听上去有些复杂,那么看图:
嗯,懂了吧.其实它是一种特殊情况,如果尖端是一个圆面的话那么它就是一个截头圆锥体,顶面半径为0的截头圆锥体就是圆锥体了.
先来看下头文件是怎么定义的吧:
class Cone {
private:
GLuint* vboId;
GLuint vert,texcoord,norm;
GLfloat* verts;
GLfloat* texcoords;
GLfloat* norms;
int vertNum,topVertNum,sideVertNum;
float radiusTop,radiusBottom,yHeight;//顶面半径,底面半径,高度
void calculateSideNormal(float& x,float& y,float& z);//计算侧面法线
public:
Cone(float rt,float rb,int m,float height);
~Cone();
void render();
};
侧面法线的计算方法,先取底面任意一点,求得圆心到该点的向量,然后沿着此向量把该截头圆锥体劈开,如图所示
然后把红色的向量沿着它的方向平移到圆周上的点,如图所示:
利用相似三角形即可求出紫色的法线N,具体代码如下:
void Cone::calculateSideNormal(float& x,float& y,float& z) {
y=(radiusBottom-radiusTop)/yHeight*sqrtf(x*x+z*z);
if(x=&