#include<Windows.h> #include<osg/Node> #include<osg/Geode> #include<osg/Group> #include <osg/Geometry> #include<osgUtil/Optimizer> #include <cmath> #include<iostream> #include<osgViewer/Viewer> #include<osgDB/ReadFile> #include<osgDB/WriteFile> #define PI 3.1415926 osg::Vec3 pointSet[100000]; #define N 301 int main() { float phi = (sqrt(5) + 1) / 2 - 1; //float phi = 0.617; float xTemp,yTemp,zTemp; for (int i=1;i<= N;i++) { zTemp = (2*(float)i-1)/ N -1; xTemp = sqrt(1 - zTemp*zTemp)*cos(2 * PI*(float)i*phi); yTemp = sqrt(1 - zTemp*zTemp)*sin(2 * PI*(float)i*phi); pointSet[i - 1].set(xTemp, yTemp, zTemp); pointSet[i - 1].normalize(); } std::ofstream outf; outf.open("shotEye.txt", std::ios::trunc); for (int i = 0; i < N; i++) { outf << pointSet[i]._v[0] << " " << pointSet[i]._v[1] << " " << pointSet[i]._v[2] << std::endl; } outf.close(); osg::ref_ptr<osg::Vec3Array> vertex = new osg::Vec3Array; osg::ref_ptr<osg::Vec3Array> normal = new osg::Vec3Array; for (int i=0;i<N;i++) { vertex->push_back(pointSet[i]); normal->push_back(pointSet[i]); } osg::ref_ptr<osg::Vec4Array> colorArray = new osg::Vec4Array; colorArray->push_back(osg::Vec4(1.0f, 0.0f, 0.0f, 1.0f)); osg::ref_ptr<osgViewer::Viewer> viewer = new osgViewer::Viewer; osg::ref_ptr<osg::Group> node = new osg::Group; osg::ref_ptr<osg::Geode> geode = new osg::Geode; osg::ref_ptr<osg::Geometry> geometry = new osg::Geometry; geometry->setVertexArray(vertex.get()); geometry->setNormalArray(normal.get()); geometry->setColorArray(colorArray.get()); geometry->setColorBinding(osg::Geometry::BIND_OVERALL); geometry->setNormalBinding(osg::Geometry::BIND_PER_VERTEX); geometry->addPrimitiveSet(new osg::DrawArrays(osg::PrimitiveSet::POINTS, 0, N)); geode->addDrawable(geometry); node->addChild(geode); osgUtil::Optimizer optimizer; optimizer.optimize(node.get()); viewer->setSceneData(node.get()); viewer->realize(); viewer->run(); return 0; }
效果图:
实现原理来自: