#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 t0 = QVector3D(0.0, 0.0, 0.0); //dummy texture QVector3D northpol = v_Y; QVector3D southpol = -v_Y; QVector3D point1; QVector3D point2; m_firstPoint = m_points->size(); for (int slice = 1; slice < m_slices; slice += 2) { m_points->append(GLPoint(m_radius * northpol, northpol, t0, m_color)); for (int stack = 1; stack < m_stacks; stack++) { point1 = calculatePoint(2 * M_PI * slice / m_slices, stack * M_PI / m_stacks); m_points->append(GLPoint(m_radius * point1, point1, t0, m_color)); point2 = calculatePoint(2 * M_PI * (slice - 1) / m_slices, stack * M_PI / m_stacks); m_points->append(GLPoint(m_radius * point2, point2, t0, m_color)); } m_points->append(GLPoint(m_radius * southpol, southpol, t0, m_color)); for (int stack = m_stacks - 1; stack >= 1; stack--) { point1 = calculatePoint(2 * M_PI * slice / m_slices, stack * M_PI / m_stacks); m_points->append(GLPoint(m_radius * point1, point1, t0, m_color)); point2 = calculatePoint(2 * M_PI * (slice + 1) / m_slices, stack * M_PI / m_stacks); m_points->append(GLPoint(m_radius * point2, point2, t0, m_color)); } m_points->append(GLPoint(m_radius * northpol, northpol, t0, m_color)); } m_nextPoint = m_points->size(); } QVector3D GLSphere::calculatePoint(double sliceRotation, double stackRotation) { double x = sin(stackRotation) * sin(sliceRotation); double y = cos(stackRotation); double z = sin(stackRotation) * cos(sliceRotation); return QVector3D(x, y, z); }