#include "glsphere.h" GLSphere::GLSphere(double radius, int stacks, int slices) : GLBody(radius) { m_stacks = stacks; m_slices = slices; } void GLSphere::makeSurface(QVector *pointContainer, QVector *indexContainer) { GLBody::makeSurface(pointContainer, indexContainer); QVector3D n0 = v_XYZ; //dummy normal QVector3D t0 = QVector3D(0.0, 0.0, 0.0); //dummy texture QVector3D northpol = v_Y * m_radius; QVector3D southpol = -v_Y * m_radius; m_firstPoint = m_points->size(); for (int slice = 1; slice < m_slices; slice += 2) { m_points->append(GLPoint(northpol, n0, t0, GLColorRgba::clMagenta)); for (int stack = 1; stack < m_stacks; stack++) { m_points->append(GLPoint(calculatePoint(2 * M_PI * slice / m_slices, stack * M_PI / m_stacks), n0, t0, m_color)); m_points->append(GLPoint(calculatePoint(2 * M_PI * (slice - 1) / m_slices, stack * M_PI / m_stacks), n0, t0, m_color)); } m_points->append(GLPoint(southpol, n0, t0, GLColorRgba::clMagenta)); } m_nextPoint = m_points->size(); } QVector3D GLSphere::calculatePoint(double sliceRotation, double stackRotation) { double x = m_radius * sin(stackRotation) * sin(sliceRotation); double y = m_radius * cos(stackRotation); double z = m_radius * sin(stackRotation) * cos(sliceRotation); return QVector3D(x, y, z); }