Generating a Gsphere

Started by
19 comments, last by Scottehy 13 years, 11 months ago
I've lost my gdnet+, so I can't access my web storage, but here goes...

#include <windows.h>#include <stdio.h>#include <stdlib.h>#include <stdarg.h>#include <math.h>#include <vector>#include <gl/glut.h>float width  = 640;float height = 480;float elevation = 0;float rotation	= 0;int level = 0;int zoom = 5;bool keyLeft=false;bool keyRight=false;bool keyUp=false;bool keyDown=false;void glutKeyboard(unsigned char key, int x, int y){	if (key == 27)		exit(0);	if(key == '-')	{		if(level > 0) level--;	}	if(key == '+' || key == '=')	{		if(level < 10) level++;	}}void glutKeyboardUp(unsigned char key, int x, int y){}void glutSpecial(int key, int x, int y){	if(key == GLUT_KEY_DOWN)		keyDown = true;	if(key == GLUT_KEY_UP)		keyUp = true;	if(key == GLUT_KEY_LEFT)		keyLeft = true;	if(key == GLUT_KEY_RIGHT)		keyRight = true;}void glutMouse(int button, int state, int x, int y){	if(state == GLUT_DOWN && button == GLUT_LEFT_BUTTON && level > 0)		level--;		if(state == GLUT_DOWN && button == GLUT_RIGHT_BUTTON && level < 6)		level++;	if(state == GLUT_DOWN && button == GLUT_MIDDLE_BUTTON)		zoom = (zoom + 1) % 10;}void glutSpecialUp(int key, int x, int y){	if(key == GLUT_KEY_DOWN)		keyDown = false;	if(key == GLUT_KEY_UP)		keyUp = false;	if(key == GLUT_KEY_LEFT)		keyLeft = false;	if(key == GLUT_KEY_RIGHT)		keyRight = false;}void glutPassiveMotion(int x, int y){	rotation  += (x - width / 2) / 100.0f;	elevation += (y - height / 2) / 100.0f;}void glutDisplay(){	glutWarpPointer(width / 2, height / 2);	if(keyLeft)		rotation  += 0.03f;	if(keyRight)	rotation  -= 0.03f;	if(keyDown)		elevation += 0.03f;	if(keyUp)		elevation -= 0.03f;	float cos_rot = cos(rotation);	float sin_rot = sin(rotation);	float cos_elv = cos(elevation);	float sin_elv = sin(elevation);	float eye[3];	float dir[3];	float side[3];	float up[3];	side[0] = -sin_rot; 	side[1] = 0.0f;	side[2] = cos_rot;	dir[0] = cos_rot * cos_elv; 	dir[1] = sin_elv;	dir[2] = sin_rot * cos_elv;	up[0] = (side[1] * dir[2]) - (side[2] * dir[1]);	up[1] = (side[2] * dir[0]) - (side[0] * dir[2]);	up[2] = (side[0] * dir[1]) - (side[1] * dir[0]);		float distance = 6.25f - (zoom * 0.5f);	eye[0] = dir[0] * distance;	eye[1] = dir[1] * distance;	eye[2] = dir[2] * distance;		glClearColor(0.2f, 0.2f, 0.2f, 0.2f);	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);	glMatrixMode(GL_PROJECTION);	glLoadIdentity();	gluPerspective(75.0f, 4 / 3.0f, 0.1f, 1000.0f);	glMatrixMode(GL_MODELVIEW);	glLoadIdentity();	gluLookAt(eye[0], eye[1], eye[2], 0, 0, 0, up[0], up[1], up[2]);	glPushMatrix();	extern void renderGeosphere(unsigned int level);	renderGeosphere(level);	glPopMatrix();	glutSwapBuffers();}void glutTimer(int t){	glutDisplay();	glutTimerFunc(t, glutTimer, (int) 500.0f / 60.0f);}	void glutReshape(int w, int h){	width  = w;	height = h;	glViewport(	0, 0, w, h);}void main(int argc, char** argv){    glutInit( &argc, argv );	glutInitDisplayMode		(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH);		glutInitWindowSize		(width, height);	glutInitWindowPosition	(0, 0);	glutCreateWindow		("geosphere");		glPointSize				(3.0f);	glEnable				(GL_BLEND);	glBlendFunc				(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);	glEnable				(GL_CULL_FACE);		glutPassiveMotionFunc	(glutPassiveMotion);	glutKeyboardFunc		(glutKeyboard);	glutKeyboardUpFunc		(glutKeyboardUp);	glutSpecialFunc			(glutSpecial);	glutSpecialUpFunc		(glutSpecialUp);	glutMouseFunc			(glutMouse);	glutDisplayFunc			(glutDisplay);	glutReshapeFunc			(glutReshape);	glutTimerFunc			(0, glutTimer, (int) 100.0f / 60.0f);	glutIgnoreKeyRepeat		(true);	// light init	GLfloat mat_ambient[] = { 1.0, 1.0, 1.0, 1.0 };	GLfloat mat_specular[] = { 1.0, 1.0, 1.0, 1.0 };	GLfloat light_position[] = { 0.0, -10.0, -10.0, 1.0 };	GLfloat lm_ambient[] = { 0.3, 0.3, 0.3, 1.0 };	glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient);	glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);	glMaterialf(GL_FRONT, GL_SHININESS, 50.0);	glLightfv(GL_LIGHT0, GL_POSITION, light_position);	glLightModelfv(GL_LIGHT_MODEL_AMBIENT, lm_ambient);	glEnable(GL_LIGHTING);	glEnable(GL_LIGHT0);	glEnable(GL_DEPTH_TEST);	glShadeModel(GL_SMOOTH);	glutMainLoop			();}struct Vector{	Vector(){}	Vector(float ix, float iy, float iz) : x(ix), y(iy), z(iz){}	Vector operator+(const Vector& other) const { return Vector(x + other.x, y + other.y, z + other.z); }	Vector operator-(const Vector& other) const { return Vector(x - other.x, y - other.y, z - other.z); }	Vector operator*(const float& scalar) const { return Vector(x * scalar, y * scalar, z * scalar); }	Vector operator^(const Vector& other) const { return Vector((y * other.z) - (z * other.y), (z * other.x) - (x * other.z), (x * other.y) - (y * other.x)); }	void normalise() { float l = sqrt(x*x+y*y+z*z); x /= l; y /= l; z /= l; }	float x, y, z;};struct Mesh{	Mesh()	{		m_displayList = GL_INVALID_VALUE;	}	~Mesh()	{		if(glIsList(m_displayList))			glDeleteLists(m_displayList, 1);	}	void render() const	{		if(glIsList(m_displayList))			glCallList(m_displayList);	}	bool buildDisplayList()	{		if(glIsList(m_displayList))			glDeleteLists(m_displayList, 1);				m_displayList = glGenLists(1);				if(m_displayList == GL_INVALID_VALUE)			return false;		glNewList(m_displayList, GL_COMPILE);		const Vector* vertices = &(m_vertices[0]);		unsigned int triangleCount = m_vertices.size() / 3;		glColor4f(1.0f, 0.0f, 0.0f, 0.5f);		glBegin(GL_TRIANGLES);		for(unsigned int i = 0; i < triangleCount; i ++)		{			const Vector& v0 =  vertices;<br>			<span class="cpp-keyword">const</span> Vector&amp; v1 =  vertices;<br>			<span class="cpp-keyword">const</span> Vector&amp; v2 =  vertices;<br>			Vector n = (v2 - v0) ^ (v1 - v0);<br>			n.normalise();<br>			glNormal3f(n.x, n.y, n.z);<br>			glVertex3f(v0.x, v0.y, v0.z);<br>			glVertex3f(v1.x, v1.y, v1.z);<br>			glVertex3f(v2.x, v2.y, v2.z);<br>		}<br>		glEnd();<br>		glEndList();<br>		<span class="cpp-keyword">return</span> <span class="cpp-keyword">true</span>;<br>	}<br><br>	GLuint m_displayList;<br>	std::vector&lt;Vector&gt; m_vertices;<br>};<br><br>Mesh* icosahedron()<br>{<br>	<span class="cpp-keyword">static</span> <span class="cpp-keyword">const</span> <span class="cpp-keyword">float</span> a = (<span class="cpp-keyword">float</span>) sqrt(<span class="cpp-number">2</span>.0f/(<span class="cpp-number">5</span>.0f + sqrt(<span class="cpp-number">5</span>.0f)));<br>	<span class="cpp-keyword">static</span> <span class="cpp-keyword">const</span> <span class="cpp-keyword">float</span> b = (<span class="cpp-keyword">float</span>) sqrt(<span class="cpp-number">2</span>.0f/(<span class="cpp-number">5</span>.0f - sqrt(<span class="cpp-number">5</span>.0f)));<br><br>	<span class="cpp-keyword">static</span> Vector vertices[<span class="cpp-number">12</span>] = <br>	{<br>		Vector(-a, <span class="cpp-number">0</span>.0f, b), Vector(a, <span class="cpp-number">0</span>.0f, b), Vector(-a, <span class="cpp-number">0</span>.0f, -b), Vector(a, <span class="cpp-number">0</span>.0f, -b),<br>		Vector(<span class="cpp-number">0</span>.0f, b, a), Vector(<span class="cpp-number">0</span>.0f, b, -a), Vector(<span class="cpp-number">0</span>.0f, -b, a), Vector(<span class="cpp-number">0</span>.0f, -b, -a),<br>		Vector(b, a, <span class="cpp-number">0</span>.0f), Vector(-b, a, <span class="cpp-number">0</span>.0f), Vector(b, -a, <span class="cpp-number">0</span>.0f), Vector(-b, -a, <span class="cpp-number">0</span>.0f)<br>	};<br><br>	<span class="cpp-keyword">static</span> <span class="cpp-keyword">unsigned</span> <span class="cpp-keyword">short</span> triangles[<span class="cpp-number">20</span>][<span class="cpp-number">3</span>] = <br>	{<br>		{ <span class="cpp-number">1</span>,  <span class="cpp-number">4</span>, <span class="cpp-number">0</span> }, {  <span class="cpp-number">4</span>, <span class="cpp-number">9</span>, <span class="cpp-number">0</span> }, { <span class="cpp-number">4</span>, <span class="cpp-number">5</span>,  <span class="cpp-number">9</span> }, { <span class="cpp-number">8</span>, <span class="cpp-number">5</span>,  <span class="cpp-number">4</span> }, { <span class="cpp-number">1</span>, <span class="cpp-number">8</span>,  <span class="cpp-number">4</span> },<br>		{ <span class="cpp-number">1</span>, <span class="cpp-number">10</span>, <span class="cpp-number">8</span> }, { <span class="cpp-number">10</span>, <span class="cpp-number">3</span>, <span class="cpp-number">8</span> }, { <span class="cpp-number">8</span>, <span class="cpp-number">3</span>,  <span class="cpp-number">5</span> }, { <span class="cpp-number">3</span>, <span class="cpp-number">2</span>,  <span class="cpp-number">5</span> }, { <span class="cpp-number">3</span>, <span class="cpp-number">7</span>,  <span class="cpp-number">2</span> },<br>		{ <span class="cpp-number">3</span>, <span class="cpp-number">10</span>, <span class="cpp-number">7</span> }, { <span class="cpp-number">10</span>, <span class="cpp-number">6</span>, <span class="cpp-number">7</span> }, { <span class="cpp-number">6</span>, <span class="cpp-number">11</span>, <span class="cpp-number">7</span> }, { <span class="cpp-number">6</span>, <span class="cpp-number">0</span>, <span class="cpp-number">11</span> }, { <span class="cpp-number">6</span>, <span class="cpp-number">1</span>,  <span class="cpp-number">0</span> },<br>		{ <span class="cpp-number">10</span>, <span class="cpp-number">1</span>, <span class="cpp-number">6</span> }, { <span class="cpp-number">11</span>, <span class="cpp-number">0</span>, <span class="cpp-number">9</span> }, { <span class="cpp-number">2</span>, <span class="cpp-number">11</span>, <span class="cpp-number">9</span> }, { <span class="cpp-number">5</span>, <span class="cpp-number">2</span>,  <span class="cpp-number">9</span> }, { <span class="cpp-number">11</span>, <span class="cpp-number">2</span>, <span class="cpp-number">7</span> }<br>	};<br><br>	Mesh* mesh = <span class="cpp-keyword">new</span> Mesh;<br>	<span class="cpp-keyword">for</span>(<span class="cpp-keyword">int</span> i = <span class="cpp-number">0</span>; i &lt; <span class="cpp-number">20</span>; i ++)<br>	{<br>		<span class="cpp-keyword">int</span> v0 = triangles<span style="font-weight:bold;">[<span class="cpp-number">0</span>];<br>		<span class="cpp-keyword">int</span> v1 = triangles<span style="font-weight:bold;">[<span class="cpp-number">1</span>];<br>		<span class="cpp-keyword">int</span> v2 = triangles<span style="font-weight:bold;">[<span class="cpp-number">2</span>];<br>		mesh-&gt;m_vertices.push_back(vertices[v0]);<br>		mesh-&gt;m_vertices.push_back(vertices[v1]);<br>		mesh-&gt;m_vertices.push_back(vertices[v2]);<br>	}<br>	mesh-&gt;buildDisplayList();<br>	<span class="cpp-keyword">return</span> mesh;<br>}<br><br>Mesh* lod(<span class="cpp-keyword">const</span> Mesh* geosphere)<br>{<br>	Mesh* mesh = <span class="cpp-keyword">new</span> Mesh;<br>	<span class="cpp-keyword">for</span>(<span class="cpp-keyword">unsigned</span> <span class="cpp-keyword">int</span> i = <span class="cpp-number">0</span>; i &lt; geosphere-&gt;m_vertices.size() / <span class="cpp-number">3</span>; i ++)<br>	{<br>		<span class="cpp-keyword">const</span> Vector&amp; v0 = geosphere-&gt;m_vertices[i*<span class="cpp-number">3</span> + <span class="cpp-number">0</span>];<br>		<span class="cpp-keyword">const</span> Vector&amp; v1 = geosphere-&gt;m_vertices[i*<span class="cpp-number">3</span> + <span class="cpp-number">1</span>];<br>		<span class="cpp-keyword">const</span> Vector&amp; v2 = geosphere-&gt;m_vertices[i*<span class="cpp-number">3</span> + <span class="cpp-number">2</span>];<br><br>		Vector m0 = (v0 + v1) * <span class="cpp-number">0</span>.5f;<br>		Vector m1 = (v1 + v2) * <span class="cpp-number">0</span>.5f;<br>		Vector m2 = (v2 + v0) * <span class="cpp-number">0</span>.5f;<br>		<br>		m0.normalise();<br>		m1.normalise();<br>		m2.normalise();<br><br>		mesh-&gt;m_vertices.push_back(v0);<br>		mesh-&gt;m_vertices.push_back(m0);<br>		mesh-&gt;m_vertices.push_back(m2);<br><br>		mesh-&gt;m_vertices.push_back(m0);<br>		mesh-&gt;m_vertices.push_back(v1);<br>		mesh-&gt;m_vertices.push_back(m1);<br><br>		mesh-&gt;m_vertices.push_back(m2);<br>		mesh-&gt;m_vertices.push_back(m1);<br>		mesh-&gt;m_vertices.push_back(v2);<br><br>		mesh-&gt;m_vertices.push_back(m0);<br>		mesh-&gt;m_vertices.push_back(m1);<br>		mesh-&gt;m_vertices.push_back(m2);<br>	}<br>	mesh-&gt;buildDisplayList();<br>	<span class="cpp-keyword">return</span> mesh;<br>}<br><br><br>std::vector&lt;<span class="cpp-keyword">const</span> Mesh*&gt; m_lods;<br><br><span class="cpp-keyword">void</span> renderGeosphere(<span class="cpp-keyword">unsigned</span> <span class="cpp-keyword">int</span> level)<br>{<br>	<span class="cpp-keyword">while</span>(level &gt;= m_lods.size())<br>	{<br>		<span class="cpp-keyword">if</span>(m_lods.size() == <span class="cpp-number">0</span>)<br>		{<br>			m_lods.push_back(icosahedron());<br>		}<br>		<span class="cpp-keyword">else</span><br>		{<br>			m_lods.push_back(lod(m_lods.back()));<br>		}		<br>	}<br><br>	GLfloat torus_diffuse[] = { <span class="cpp-number">0</span>.<span class="cpp-number">7</span>, <span class="cpp-number">0</span>.<span class="cpp-number">7</span>, <span class="cpp-number">0</span>.<span class="cpp-number">0</span>, <span class="cpp-number">1</span>.<span class="cpp-number">0</span> };<br>	GLfloat cube_diffuse[] = { <span class="cpp-number">0</span>.<span class="cpp-number">0</span>, <span class="cpp-number">0</span>.<span class="cpp-number">7</span>, <span class="cpp-number">0</span>.<span class="cpp-number">7</span>, <span class="cpp-number">1</span>.<span class="cpp-number">0</span> };<br>	GLfloat sphere_diffuse[] = { <span class="cpp-number">0</span>.<span class="cpp-number">7</span>, <span class="cpp-number">0</span>.<span class="cpp-number">0</span>, <span class="cpp-number">0</span>.<span class="cpp-number">7</span>, <span class="cpp-number">1</span>.<span class="cpp-number">0</span> };<br>	GLfloat octa_diffuse[] = { <span class="cpp-number">0</span>.<span class="cpp-number">7</span>, <span class="cpp-number">0</span>.<span class="cpp-number">4</span>, <span class="cpp-number">0</span>.<span class="cpp-number">4</span>, <span class="cpp-number">1</span>.<span class="cpp-number">0</span> };<br><br>	<span class="cpp-comment">//glMaterialfv(GL_FRONT, GL_DIFFUSE, torus_diffuse);</span><br>	glMaterialfv(GL_FRONT, GL_DIFFUSE, cube_diffuse);<br>	<span class="cpp-comment">//glMaterialfv(GL_FRONT, GL_DIFFUSE, sphere_diffuse);</span><br>	<span class="cpp-comment">//glMaterialfv(GL_FRONT, GL_DIFFUSE, octa_diffuse);</span><br><br><br>	m_lods[level]-&gt;render();<br>}<br><br></pre></div><!–ENDSCRIPT–><br><br><br>in particular, this is the icosahedron generation<br><br><!–STARTSCRIPT–><!–source lang="cpp"–><div class="source"><pre><br>Mesh* icosahedron()<br>{<br>	<span class="cpp-keyword">static</span> <span class="cpp-keyword">const</span> <span class="cpp-keyword">float</span> a = (<span class="cpp-keyword">float</span>) sqrt(<span class="cpp-number">2</span>.0f/(<span class="cpp-number">5</span>.0f + sqrt(<span class="cpp-number">5</span>.0f)));<br>	<span class="cpp-keyword">static</span> <span class="cpp-keyword">const</span> <span class="cpp-keyword">float</span> b = (<span class="cpp-keyword">float</span>) sqrt(<span class="cpp-number">2</span>.0f/(<span class="cpp-number">5</span>.0f - sqrt(<span class="cpp-number">5</span>.0f)));<br><br>	<span class="cpp-keyword">static</span> Vector vertices[<span class="cpp-number">12</span>] = <br>	{<br>		Vector(-a, <span class="cpp-number">0</span>.0f, b), Vector(a, <span class="cpp-number">0</span>.0f, b), Vector(-a, <span class="cpp-number">0</span>.0f, -b), Vector(a, <span class="cpp-number">0</span>.0f, -b),<br>		Vector(<span class="cpp-number">0</span>.0f, b, a), Vector(<span class="cpp-number">0</span>.0f, b, -a), Vector(<span class="cpp-number">0</span>.0f, -b, a), Vector(<span class="cpp-number">0</span>.0f, -b, -a),<br>		Vector(b, a, <span class="cpp-number">0</span>.0f), Vector(-b, a, <span class="cpp-number">0</span>.0f), Vector(b, -a, <span class="cpp-number">0</span>.0f), Vector(-b, -a, <span class="cpp-number">0</span>.0f)<br>	};<br><br>	<span class="cpp-keyword">static</span> <span class="cpp-keyword">unsigned</span> <span class="cpp-keyword">short</span> triangles[<span class="cpp-number">20</span>][<span class="cpp-number">3</span>] = <br>	{<br>		{ <span class="cpp-number">1</span>,  <span class="cpp-number">4</span>, <span class="cpp-number">0</span> }, {  <span class="cpp-number">4</span>, <span class="cpp-number">9</span>, <span class="cpp-number">0</span> }, { <span class="cpp-number">4</span>, <span class="cpp-number">5</span>,  <span class="cpp-number">9</span> }, { <span class="cpp-number">8</span>, <span class="cpp-number">5</span>,  <span class="cpp-number">4</span> }, { <span class="cpp-number">1</span>, <span class="cpp-number">8</span>,  <span class="cpp-number">4</span> },<br>		{ <span class="cpp-number">1</span>, <span class="cpp-number">10</span>, <span class="cpp-number">8</span> }, { <span class="cpp-number">10</span>, <span class="cpp-number">3</span>, <span class="cpp-number">8</span> }, { <span class="cpp-number">8</span>, <span class="cpp-number">3</span>,  <span class="cpp-number">5</span> }, { <span class="cpp-number">3</span>, <span class="cpp-number">2</span>,  <span class="cpp-number">5</span> }, { <span class="cpp-number">3</span>, <span class="cpp-number">7</span>,  <span class="cpp-number">2</span> },<br>		{ <span class="cpp-number">3</span>, <span class="cpp-number">10</span>, <span class="cpp-number">7</span> }, { <span class="cpp-number">10</span>, <span class="cpp-number">6</span>, <span class="cpp-number">7</span> }, { <span class="cpp-number">6</span>, <span class="cpp-number">11</span>, <span class="cpp-number">7</span> }, { <span class="cpp-number">6</span>, <span class="cpp-number">0</span>, <span class="cpp-number">11</span> }, { <span class="cpp-number">6</span>, <span class="cpp-number">1</span>,  <span class="cpp-number">0</span> },<br>		{ <span class="cpp-number">10</span>, <span class="cpp-number">1</span>, <span class="cpp-number">6</span> }, { <span class="cpp-number">11</span>, <span class="cpp-number">0</span>, <span class="cpp-number">9</span> }, { <span class="cpp-number">2</span>, <span class="cpp-number">11</span>, <span class="cpp-number">9</span> }, { <span class="cpp-number">5</span>, <span class="cpp-number">2</span>,  <span class="cpp-number">9</span> }, { <span class="cpp-number">11</span>, <span class="cpp-number">2</span>, <span class="cpp-number">7</span> }<br>	};<br><br>	Mesh* mesh = <span class="cpp-keyword">new</span> Mesh;<br>	<span class="cpp-keyword">for</span>(<span class="cpp-keyword">int</span> i = <span class="cpp-number">0</span>; i &lt; <span class="cpp-number">20</span>; i ++)<br>	{<br>		<span class="cpp-keyword">int</span> v0 = triangles<span style="font-weight:bold;">[<span class="cpp-number">0</span>];<br>		<span class="cpp-keyword">int</span> v1 = triangles<span style="font-weight:bold;">[<span class="cpp-number">1</span>];<br>		<span class="cpp-keyword">int</span> v2 = triangles<span style="font-weight:bold;">[<span class="cpp-number">2</span>];<br>		mesh-&gt;m_vertices.push_back(vertices[v0]);<br>		mesh-&gt;m_vertices.push_back(vertices[v1]);<br>		mesh-&gt;m_vertices.push_back(vertices[v2]);<br>	}<br>	mesh-&gt;buildDisplayList();<br>	<span class="cpp-keyword">return</span> mesh;<br>}<br><br></pre></div><!–ENDSCRIPT–><br><br>and this is the tesselation<br><!–STARTSCRIPT–><!–source lang="cpp"–><div class="source"><pre><br>Mesh* lod(<span class="cpp-keyword">const</span> Mesh* geosphere)<br>{<br>	Mesh* mesh = <span class="cpp-keyword">new</span> Mesh;<br>	<span class="cpp-keyword">for</span>(<span class="cpp-keyword">unsigned</span> <span class="cpp-keyword">int</span> i = <span class="cpp-number">0</span>; i &lt; geosphere-&gt;m_vertices.size() / <span class="cpp-number">3</span>; i ++)<br>	{<br>		<span class="cpp-keyword">const</span> Vector&amp; v0 = geosphere-&gt;m_vertices[i*<span class="cpp-number">3</span> + <span class="cpp-number">0</span>];<br>		<span class="cpp-keyword">const</span> Vector&amp; v1 = geosphere-&gt;m_vertices[i*<span class="cpp-number">3</span> + <span class="cpp-number">1</span>];<br>		<span class="cpp-keyword">const</span> Vector&amp; v2 = geosphere-&gt;m_vertices[i*<span class="cpp-number">3</span> + <span class="cpp-number">2</span>];<br><br>		Vector m0 = (v0 + v1) * <span class="cpp-number">0</span>.5f;<br>		Vector m1 = (v1 + v2) * <span class="cpp-number">0</span>.5f;<br>		Vector m2 = (v2 + v0) * <span class="cpp-number">0</span>.5f;<br>		<br>		m0.normalise();<br>		m1.normalise();<br>		m2.normalise();<br><br>		mesh-&gt;m_vertices.push_back(v0);<br>		mesh-&gt;m_vertices.push_back(m0);<br>		mesh-&gt;m_vertices.push_back(m2);<br><br>		mesh-&gt;m_vertices.push_back(m0);<br>		mesh-&gt;m_vertices.push_back(v1);<br>		mesh-&gt;m_vertices.push_back(m1);<br><br>		mesh-&gt;m_vertices.push_back(m2);<br>		mesh-&gt;m_vertices.push_back(m1);<br>		mesh-&gt;m_vertices.push_back(v2);<br><br>		mesh-&gt;m_vertices.push_back(m0);<br>		mesh-&gt;m_vertices.push_back(m1);<br>		mesh-&gt;m_vertices.push_back(m2);<br>	}<br>	mesh-&gt;buildDisplayList();<br>	<span class="cpp-keyword">return</span> mesh;<br>}<br><br></pre></div><!–ENDSCRIPT–><br>

Everything is better with Metal.

Advertisement
So basically, each level of detail is a tesselation of the previous level, where each triangle is divided into 4 smaller triangles, by taking the midpoint of the edges.

This means that each level of detail has 4 times the triangle (and vertex) count as the previous level of detail. The lowest level of detail is just the icosahedron.

It can't be any simpler! :)

Everything is better with Metal.

I'd have suggested oliii's solution if he hadn't beaten me to it. ;-) Let me just throw out that, although it's probably easiest to just hard-code the icosahedron vertices as oliii did, they can also be computed as the intersection of a sphere with a system of equiangular lines (which you can generate iteratively). This fact probably isn't very useful in three dimensions where it's easy to hard-code the answer, but it might be useful if you were ever in need of general-purpose n-dimensional geosphere-generation code.
Thanks a heap oliii, I'll be having a play around with this to see how it works, Thank you so much for digging that up. Thanks for the tip as well Emergent, with a username like that would you happen to use gamebryo?
One fun thing with geospheres is texturing. In this particular case, your texture needs to be split into triangles to be mapped on each icosahedron faces.

Everything is better with Metal.

in your case, this article should keep going.

Everything is better with Metal.

Quote:Original post by ScottehyEmergent, with a username like that would you happen to use gamebryo?


Nah, no connection; I chose the name before gamebryo came out, at a time when I was interested in emergent behaviors; the idea was that I, this being, was himself "just" the emergent behavior of a collection of cells/molecules/atoms/... (it's turtles all the way down?)

Basically, it was much pop-academic philosophical silliness. ;-)

But the name remains. Still, it beats my old one...

(I'm sure that's way more of an answer than you were looking for, so I'll call this an ending.)
Thanks a heap oliii, you've done more than I could ask for. I didn't realize the textures had to be put into triangles like that though. Thats really weird haha. Thanks a heap :) - that article as well looks a great read. So i'm going to read through that now.
Hmm yes, I haven;t tested the texture mapping though, so I could be wrong. Maybe a simple spherical mapping would do the trick as well.

Everything is better with Metal.

Noooooo, I want the bear back!!

This topic is closed to new replies.

Advertisement