PDA

View Full Version : Spheres

orate!
10-22-2002, 04:34 PM
Erm ... sorry to ask such a stupid question but how can i generate sphere without using Toolkits like GLU oder GLUT ...

I also doesnt want to see the diffcult pages by paul bourke ... a easy explain is all i want !!!

I have a basic knowledge of trigonmetry so u can tell me ... but please explain easily ...

THX

BYE

jmg
10-22-2002, 05:29 PM
Thanks for the Paul Bourke reference! I'd never heard of him before but his web page http://astronomy.swin.edu.au/~pbourke/
is most excellent. He discusses spheres here:
http://astronomy.swin.edu.au/~pbourke/geometry/sphere/

Sweet!

[This message has been edited by jmg (edited 10-22-2002).]

fringe
10-23-2002, 12:39 AM
Spheres are one of the easier shapes to do because they are symetric. First you have to decide which co-ordinates are on the surface of your shape (in this case a sphere). For a sphere this is all points a distance r away from the centre. You need some control over reaching each co-ordinate so we will use two angles theta and phi. Think of the center of the sphere this is just a circle. The phi variable is the angle from the x axis. If we were just drawing a circle we would draw:

x= r cos (phi) and
y= r sin (phi)

I would imagine using a loop to increment phi and draw from one bit of phi to the next.
However we have a sphere. Now if you think of a sphere it is just lots of circles but with different radi. The radius can be worked out with a bit of trig. Draw a semi-circle
|-
| \
| |
| /
|-
Mark an angle from the verticle to a point on te semi circle. Draw a horizontal line. This line is the circle in thelast bit and has a radius of sin (theta)
This circle is at a height of r cos theta
OK so now we have all our points:

x = r sin (theta) Cos (phi)
y = rsin (theta) Sin (phi)
z = r Cos (theta)

We now make two loops and draw triangle through all these points connecting them all.

glBegin(GL_Triangle_Strip)
for (int i=0;i<maxsegs;i++){
theta=Pi*i/maxsegs;
thetaplus=Pi*(i+1)/maxsegs;
for (int j=0;j<=maxsegs;j++){
phi=2*Pi*j/maxsegs;
glVertex3f(r*sin(theta)*cos(phi),r*sin(theta)*Sin( phi),r*cos(theta));
glVertex3f(r*sin(thetaplus)*cos(phi),r*sin(thetapl us)*Sin(phi),r*cos(thetaplus));
}
}

Hope that helps,

fringe

P.S. All code writtern without testing and source so there may be mistakes but as long as you understand the idea it should be fine