ÉèΪÊ×Ò³ ¼ÓÈëÊÕ²Ø

TOP

OpenGLÈýάÇòÌåÊý¾ÝÉú³ÉÓë»æÖÆ¡¾¸½Ô´Âë¡¿
2014-11-24 07:34:58 À´Ô´: ×÷Õß: ¡¾´ó ÖРС¡¿ ä¯ÀÀ:1´Î
Tags£ºOpenGL Èýά Êý¾Ý Éú³É »æÖÆ Ô´Âë

OpenGLÈýάÇòÌåÊý¾ÝÉú³ÉÓë»æÖÆÔ´Â룺


#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;


#define STEP 0.02 //²ÉÑù¼ä¸ô


//ÌåËØ½á¹¹Ìå
typedef struct Voxel
{
float x;
float y;
float z;
int value;
}Voxel;


vector VolumeData;//ÌåËØÊý×é
GLfloat h;//ÊÓµãzÖá×ø±ê


//ÇóÁ½µã¼ä¾àÀë
float Distance(float a[3], float b[3])
{
return sqrt( (a[0]-b[0]) * (a[0]-b[0]) +
(a[1]-b[1]) * (a[1]-b[1]) +
(a[2]-b[2]) * (a[2]-b[2]) );
}


//Éú³ÉÇòµÄÌåÊý¾Ý²¢±£´æµ½Îļþ£¬²ÎÊýÊǰ뾶ºÍÇòÐÄ
void GenerateVolumeData(float Radi, float Cent[3])
{
float Radius = Radi;//°ë¾¶
float Center[3];//ÇòÐÄ
float BoundBoxStart[3];//°üΧºÐÆðµã×ø±ê£¬×óϽǶ¥µã
float BoundBoxEnd[3];//°üΧºÐÖÕµã×ø±ê£¬ÓÒÉϽǶ¥µã

//³õʼ»¯
for(int m=0; m<3; m++)
{
Center[m] = Cent[m];//ÇòÐÄ
BoundBoxStart[m] = Center[m] - Radius;//°üΧºÐÆðµã
BoundBoxEnd[m] = Center[m] + Radius + 0.02;//°üΧºÐÖÕµã
}


ofstream fout_VolumeData;
fout_VolumeData.open("VolumeData.txt");//±£´æÌåÊý¾ÝµÄÎļþ


//±éÀú°üΧºÐÄڵĵã
for(float i=BoundBoxStart[0]; i<=BoundBoxEnd[0]; i+=STEP)
{
for(float j=BoundBoxStart[1]; j<=BoundBoxEnd[1]; j+=STEP)
{
for(float k=BoundBoxStart[2]; k<=BoundBoxEnd[2]; k+=STEP*2)
{
float point[3]={i,j,k};
float dist = Distance(point,Center);//µãpointºÍÇòÐÄÖ®¼äµÄ¾àÀë
fout_VolumeData.setf(ios::fixed);//²»ÒÔ¿ÆÑ§¼¼Êõ·¨ÏÔʾ
fout_VolumeData.precision(5);//ÉèÖþ«¶È
fout_VolumeData < if( fabs(dist-Radius) < 0.01 )//µãpointÔÚÇòÉÏ£¬Êä³ö0
fout_VolumeData << 0;
else if( dist < Radius )//µãpointÔÚÇòÄÚ£¬Êä³ö-1
fout_VolumeData << -1;
else// if( dist > Radius )//µãpointÔÚÇòÍ⣬Êä³ö1
fout_VolumeData << 1;
fout_VolumeData < }
}
}
fout_VolumeData.close();
}



//´°¿Ú³õʼ»¯ºÍ´óС¸Ä±äʱ£¬µ÷Óô˺¯Êý
void CALLBACK reshape(GLsizei w,GLsizei h)
{
glMatrixMode(GL_PROJECTION);//ÉèÖõ±Ç°¾ØÕóΪͶӰ±ä»»¾ØÕó
glLoadIdentity();//³õʼ»¯µ±Ç°¾ØÕó
gluPerspective(20,1,0,3);//ÉèÖÃ͸ÊÓͶӰ¾ØÕó
glMatrixMode(GL_MODELVIEW);//ÉèÖõ±Ç°¾ØÕóΪģʽ±ä»»¾ØÕó
glViewport(0,0,w,h);//ÉèÖÃÊÓÇø±ä»»
}


//ÏÔʾº¯Êý
void CALLBACK display()
{
glClearColor(0,1,1,1);//ÉèÖô°¿Ú±³¾°ÑÕÉ«
glClear(GL_COLOR_BUFFER_BIT);//ÇåÑÕÉ«»º³åÇø


glLoadIdentity();//ÖØÖñ任¾ØÕó
gluLookAt(5,5,h,0,0,0,0,1,0);//ÉèÖÃÊÓµã×ø±ê
glColor3f(1,0,0);//ÉèÖÃǰ¾°É«

glBegin(GL_POINTS);
//±éÀúÌåËØÊý×é
vector::iterator iter = VolumeData.begin();
for(; iter != VolumeData.end(); iter++)
{
if( iter->value==0)
glVertex3f(iter->x,iter->y,iter->z);
}
glEnd();


glFlush();//ˢлº³åÇø
}


//ÉÏ·½Ïò¼ü
void CALLBACK Up()
{
h+=0.1;
}


//Ï·½Ïò¼ü
void CALLBACK Down()
{
h-=0.1;
}


void main()
{
float Radius = 1;//°ë¾¶
float Center[3]={0,0,0};//ÇòÐÄ


GenerateVolumeData(Radius,Center);//Éú³ÉÌåÊý¾Ý²¢±£´æµ½Îļþ


ifstream fin;
fin.open("VolumeData.txt");
if(!fin) cout<<"ÎÞ·¨´ò¿ªÌåÊý¾ÝÎļþ"<

//½«ÌåÊý¾Ý¶ÁÈëÌåËØÊý×é
while(!fin.eof())
{
Voxel vox;
fin >> vox.x;
fin >> vox.y;
fin >> vox.z;
fin >> vox.value;
VolumeData.push_back(vox);//²åÈëÊý×é
}


auxInitDisplayMode(AUX_SINGLE | AUX_RGBA);//ÉèÖô°¿ÚÏÔʾģʽ
auxInitPosition(0,0,500,500);//ÉèÖô°¿ÚλÖÃ
auxInitWindow("ÈýάÇòÌå");//´°¿Ú±êÌâ


glShadeModel(GL_FLAT);//ÉèÖÃ×ÅɫģʽΪºã¶¨×ÅÉ«


//ÉÏÏ·½Ïò¼üµ÷ÕûÊÓµãλÖÃ
auxKeyFunc(AUX_UP,Up);
auxKeyFunc(AUX_DOWN,Down);


auxReshapeFunc(reshape);//ÖØ¶¨ÐÎ×´
auxMainLoop(display);//Ñ­»·»æÖÆ
}


Ч¹ûͼ£º





Ô´ÂëÏÂÔØ£º


¾ßÌåÏÂÔØÄ¿Â¼ÔÚ /2013Äê×ÊÁÏ/4ÔÂ/22ÈÕ/OpenGLÈýάÇòÌåÊý¾ÝÉú³ÉÓë»æÖÆ¡¾¸½Ô´Âë¡¿


¡¾´ó ÖРС¡¿¡¾´òÓ¡¡¿ ¡¾·±Ìå¡¿¡¾Í¶¸å¡¿¡¾Êղء¿ ¡¾ÍƼö¡¿¡¾¾Ù±¨¡¿¡¾ÆÀÂÛ¡¿ ¡¾¹Ø±Õ¡¿ ¡¾·µ»Ø¶¥²¿¡¿
·ÖÏíµ½: 
ÉÏһƪ£ºQtʵÏÖ¸´ÔÓµÄÁÐ±í¿Ø¼þ ÏÂһƪ£ºC++ ¾²Ì¬³ÉÔ±±äÁ¿ ÔÚÀàÖеÄʵÏÖ

ÆÀÂÛ

ÕÊ¡¡¡¡ºÅ: ÃÜÂë: (ÐÂÓû§×¢²á)
Ñé Ö¤ Âë:
±í¡¡¡¡Çé:
ÄÚ¡¡¡¡ÈÝ:

¡¤Linuxϵͳ¼ò½é (2025-12-25 21:55:25)
¡¤Linux°²×°MySQL¹ý³Ì (2025-12-25 21:55:22)
¡¤Linuxϵͳ°²×°½Ì³Ì£¨ (2025-12-25 21:55:20)
¡¤HTTP Åc HTTPS µÄ²î„ (2025-12-25 21:19:45)
¡¤ÍøÕ¾°²È«±ØÐ޿ΣºÍ¼ (2025-12-25 21:19:42)