Sign in to follow this  
LordFallout

Sphere generation problem

Recommended Posts

I'm attempting to generate Sphere Vertex data based on the sphere games Sky Domes pdf. found at http://www.spheregames.com/files/SkyDomesPDF.zip if i implement the code in the pdf for generating a dome it works, however the dome is on its side. This is easy to fix. The second problem is when i try to extend the Dome into a full Sphere You can see the problem here Image Hosted by ImageShack.us Basically instead of extending the sphere it goes back over the Dome. I use the following method to determine the vertices for the dome
	m_pVerts = new sVertexXYZCUV[m_iNumberOfVertices];

	int n = 0;
	for(int iPhi = -90; iPhi < 90; iPhi += m_idPhi)
	{
		for(int iTheta = 0; iTheta < 360; iTheta += m_idTheta)
		{
			m_pVerts[n].fX = m_fRadius * sinf(iPhi * DTOR) * cosf(DTOR * iTheta);
			m_pVerts[n].fY = m_fRadius * sinf(iPhi * DTOR) * sinf(DTOR * iTheta);
			m_pVerts[n].fZ = m_fRadius * cosf(iPhi * DTOR);
			n++;

			m_pVerts[n].fX = m_fRadius * sinf((iPhi + m_idPhi) * DTOR) * cosf(iTheta * DTOR);
			m_pVerts[n].fY = m_fRadius * sinf((iPhi + m_idPhi) * DTOR) * sinf(iTheta * DTOR);
			m_pVerts[n].fZ = m_fRadius * cosf((iPhi + m_idPhi) * DTOR);
			n++;
			
			m_pVerts[n].fX = m_fRadius * sinf(DTOR * iPhi) * cosf(DTOR * (iTheta + m_idTheta));
			m_pVerts[n].fY = m_fRadius * sinf(DTOR * iPhi) * sinf(DTOR * (iTheta + m_idTheta));
			m_pVerts[n].fZ = m_fRadius * cosf(DTOR * iPhi);
			n++;
			
			if(iPhi > -90 && iPhi < 90)
			{
				m_pVerts[n].fX = m_fRadius * sinf((iPhi + m_idPhi) * DTOR) * cosf(DTOR * (iTheta + m_idTheta));
				m_pVerts[n].fY = m_fRadius * sinf((iPhi + m_idPhi) * DTOR) * sinf(DTOR * (iTheta + m_idTheta));
				m_pVerts[n].fZ = m_fRadius * cosf((iPhi + m_idPhi) * DTOR);
				n++;
			}
		}
	}



DTOR is defined as D3DX_PI / 180.0f This is me attempting to implement the latitude / longitude method :S [Edited by - LordFallout on March 20, 2008 9:42:11 AM]

Share this post


Link to post
Share on other sites
I managed to sort the orientation problem by switching the Y and Z co-ordinate calculations.

Also, i managed to make a whole sphere, there still exists a problem thought

Image Hosted by ImageShack.us

I'm not sure if its clear or not from this photo but the vertices are mixed up towards the poles.

This was the semi solution

m_pVerts = new sVertexXYZCUV[m_iNumberOfVertices];

int n = 0;
for(float fPhi = -90; fPhi < 90; fPhi += m_fdPhi)
{
for(float fTheta = 0; fTheta < 360; fTheta += m_fdTheta)
{
m_pVerts[n].fX = m_fRadius * sinf(fPhi * DTOR) * cosf(DTOR * fTheta);
m_pVerts[n].fY = m_fRadius * cosf(fPhi * DTOR);
if(fPhi < 0)
m_pVerts[n].fY = -m_pVerts[n].fY;
m_pVerts[n].fZ = m_fRadius * sinf(fPhi * DTOR) * sinf(DTOR * fTheta);
n++;

m_pVerts[n].fX = m_fRadius * sinf((fPhi + m_fdPhi) * DTOR) * cosf(fTheta * DTOR);
m_pVerts[n].fY = m_fRadius * cosf((fPhi + m_fdPhi) * DTOR);
if(fPhi < 0)
m_pVerts[n].fY = -m_pVerts[n].fY;
m_pVerts[n].fZ = m_fRadius * sinf((fPhi + m_fdPhi) * DTOR) * sinf(fTheta * DTOR);
n++;

m_pVerts[n].fX = m_fRadius * sinf(fPhi * DTOR) * cosf(DTOR * (fTheta + m_fdTheta));
m_pVerts[n].fY = m_fRadius * cosf(fPhi * DTOR);
if(fPhi < 0)
m_pVerts[n].fY = -m_pVerts[n].fY;
m_pVerts[n].fZ = m_fRadius * sinf(fPhi * DTOR) * sinf(DTOR * (fTheta + m_fdTheta));
n++;

m_pVerts[n].fX = m_fRadius * sinf((fPhi + m_fdPhi) * DTOR) * cosf(DTOR * (fTheta + m_fdTheta));
m_pVerts[n].fY = m_fRadius * cosf((fPhi + m_fdPhi) * DTOR);
if(fPhi < 0)
m_pVerts[n].fY = -m_pVerts[n].fY;
m_pVerts[n].fZ = m_fRadius * sinf((fPhi + m_fdPhi) * DTOR) * sinf(DTOR * (fTheta + m_fdTheta));
n++;
}
}



The initial problem arose because the cos of a number would be the same no matter if it was positive or negative, hence the solution to check if the number is negative or not, i think there might have been a better solution, if anyone notices it, please post for me. I'm going to continue my search.

Share this post


Link to post
Share on other sites
wow, i've spent the past five hours doing nothing, :) the fix was to

for(float fPhi = 0; fPhi < 180; fPhi += m_fdPhi)
{



instead of


for(float fPhi = -90; fPhi < 90; fPhi += m_fdPhi)
{



Maybe that'll help someone else out in the future :)

Now onto the colouring.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Sign in to follow this