C++ (Qt)struct UV { qreal u, v;}; UV GetUV( qreal angleU, qreal angleV ){ UV uv; uv.u = angleU / (M_PI * 2); uv.v = angleV / (M_PI / 2) + 0.5; return uv;} void BuildSpherePart( qreal startU, qreal stepU, qreal int numU, // широта (0..2*PI) qreal startV, qreal stepV, qreal int numV, // долгота (-PI/2 .. +PI/2) // ... др параметры {// находим диапазон UV minUV = GetUV(startU, startV); UV maxUV = GetUV(startU + stepU * (numU - 1), startV + stepV * (numV - 1)); minUV.v = Mercator2SphereAnalytic(minUV.v); maxUV.v = Mercator2SphereAnalytic(maxUV.v); // вычисляем UV координаты для сферы for (int i = 0; i < numU; ++i) for (int j = 0; j < numV; ++j) { qreal angleU = startU + stepU * i; qreal angleV = startV + stepV * j; // добавляем вертекс qreal y = sin(angleV); qreal len = sqrt(1 - y * y); qreal x = cos(angleU) * len; qreal z = sin(angleU) * len; prim.appendVertex(QPoint3D(x, y, z) * radius); // получаем сферические UV UV uv = GetUV(angleU, angleV); // получаем V меркатора uv.v = Mercator2SphereAnalytic(maxUV.v); // нормируем UV uv.u = (uv.u - minUV.u) / (maxUV.u - minUV.u); uv.v = (uv.c - minUV.v) / (maxUV.v - minUV.v); prim.appendTexCoord(QVector2D(UV.u, UV.v)); } }}
QGLSceneNode* Earth::BuildSpherePart(qreal startU, qreal stepU, int numU, // широта (0..2*PI) qreal startV, qreal stepV, int numV // долгота (-PI/2 .. +PI/2) ){// находим диапазон UV minUV = GetUV(startU, startV); UV maxUV = GetUV(startU + stepU * (numU - 1), startV + stepV * (numV - 1)); minUV.v = Mercator2SphereAnalytic(minUV.v); maxUV.v = Mercator2SphereAnalytic(maxUV.v); QGLBuilder tempBuilder; QGeometryData prim;// вычисляем UV координаты для сферы for (int i = 0; i < numU; ++i) { for (int j = 0; j < numV; ++j) { qreal angleU = startU + stepU * i; qreal angleV = startV + stepV * j; // добавляем вертекс qreal y = sin(angleV); qreal len = sqrt(1 - y * y); qreal x = cos(angleU) * len; qreal z = sin(angleU) * len; prim.appendVertex(QVector3D(x, y, z) * a); prim.appendNormal(QVector3D(x, y, z) * a); // получаем сферические UV UV uv = GetUV(angleU, angleV); // получаем V меркатора uv.v = Mercator2SphereAnalytic(maxUV.v); // нормируем UV uv.u = (uv.u - minUV.u) / (maxUV.u - minUV.u); uv.v = (uv.v - minUV.v) / (maxUV.v - minUV.v); prim.appendTexCoord(QVector2D(uv.u, uv.v)); } tempBuilder.addQuadStrip(prim); prim.clear(); } return tempBuilder.finalizedSceneNode();}
C++ (Qt)struct UV { qreal u, v;}; UV GetUV( qreal angleU, qreal angleV ){ UV uv; uv.u = angleU / (M_PI * 2); uv.v = angleV / (M_PI / 2) + 0.5; return uv;}
uv.v = angleV / (M_PI) + 0.5;
QGLSceneNode* Earth::BuildSpherePart(qreal startU, qreal stepU, int numU, // широта (0..2*PI) qreal startV, qreal stepV, int numV // долгота (-PI/2 .. +PI/2) // ... др параметры ){// находим диапазон UV minUV = GetUV(startU, startV); UV maxUV = GetUV(startU + stepU * (numU - 1), startV + stepV * (numV - 1)); minUV.v = Mercator2SphereAnalytic(minUV.v); maxUV.v = Mercator2SphereAnalytic(maxUV.v); QGLBuilder tempBuilder; QGeometryData prim;// вычисляем UV координаты для сферы for (int i = 0; i <= numU; ++i) { prim.clear(); for (int j = 0; j <= numV; ++j) { qreal angleU = startU + stepU * i; qreal angleV = startV + stepV * j; // добавляем вертекс qreal y = sin(angleV); qreal len = sqrt(1 - y * y); qreal x = cos(angleU) * len; qreal z = sin(angleU) * len; prim.appendVertex(QVector3D(x, y, z) * a); prim.appendNormal(QVector3D(x, y, z) * a); // получаем сферические UV UV uv = GetUV(angleU, angleV); // получаем V меркатора uv.v = Mercator2SphereAnalytic(maxUV.v); // нормируем UV uv.u = (uv.u - minUV.u) / (maxUV.u - minUV.u); uv.v = (uv.v - minUV.v) / (maxUV.v - minUV.v); prim.appendTexCoord(QVector2D(uv.u, uv.v)); // second vertex angleU = startU + stepU * (i+1); angleV = startV + stepV * j; // добавляем вертекс y = sin(angleV); len = sqrt(1 - y * y); x = cos(angleU) * len; z = sin(angleU) * len; prim.appendVertex(QVector3D(x, y, z) * a); prim.appendNormal(QVector3D(x, y, z) * a); // получаем сферические UV uv = GetUV(angleU, angleV); // получаем V меркатора uv.v = Mercator2SphereAnalytic(maxUV.v); // нормируем UV uv.u = (uv.u - minUV.u) / (maxUV.u - minUV.u); uv.v = (uv.v - minUV.v) / (maxUV.v - minUV.v); prim.appendTexCoord(QVector2D(uv.u, uv.v)); } tempBuilder.addQuadStrip(prim); } return tempBuilder.finalizedSceneNode();}
// получаем V меркатора uv.v = Mercator2SphereAnalytic(maxUV.v);
// получаем V меркатора uv.v = Mercator2SphereAnalytic(uv.v);