void torus(float out_radius, float int_radius, int textureId);
The method takes as input the tube radius ,the big radius from the center of the torus and a texture id. For a good quality rendering is important to set the normal on each vertex of the torus mesh, so for this reason we have the following private method used by torus:
Vector3 Geometry::getPointNormal(float out_angle,float int_angle,
float out_radius,float int_radius){
Vector3 tangentOut( -sin(out_angle),
cos(out_angle),
0);
Vector3 tangentInt( cos(out_angle)*(-sin(int_angle)) ,
sin(out_angle)*(-sin(int_angle)) ,
cos(int_angle) );
Vector3 normal = tangentOut^tangentInt;
return normal.Normalize();
}
getPointNormal() returns the normal vector (angles in radiants) for a vertex identified by polar coordinates. Another method used by the torus is:
Vector3 Geometry::getPoint(float out_angle,float int_angle, float out_radius,
float int_radius){
return Vector3( ( out_radius+int_radius*cos(int_angle) )*cos(out_angle),
( out_radius+int_radius*cos(int_angle) )*sin(out_angle),
int_radius*sin(int_angle));
}
That returns cartesian coordinates from polar coordinates. For apply the texture we have the method:
void Geometry::glTorusTexCoord(float out_angle,float int_angle,int tx){
glTexCoord2f( out_angle/PI , (int_angle)/PI );
}
The texture file must reside in your project directory. In my case I made a directory called texture and I put the file here.Download the sources here
Here it is the video demo: