-
大小: 122KB文件類型: .rar金幣: 2下載: 0 次發布日期: 2021-06-07
- 語言: 其他
- 標簽: Ray-casting??
資源簡介
本程序實現了體繪制中的光線投射算法,核心代碼純C,只在顯示的時候使用了OpenGL。

代碼片段和文件信息
#include
#include
#include
#include?
#define?EPSILON?0.000001
#define?WIDTH?400
#define?HEIGTH?500
float?Image[WIDTH*HEIGTH*4];
void?GenerateVolume(int?*Dataint*?Dim);//生成體數據
void?GenCube(int?xint?yint?zint?sideint?density?int?*Dataint?*Dim);//生成正方體數據
void?GenSphere(int?xint?yint?zint?radiusint?densityint?*Dataint?*Dim);//生成球體數據
void?Classify(float*?CDataint?*Dataint?*Dim);//數據分類
void?RotationMatrix(float?*Rfloat?*eyefloat?*centerfloat?*up);//求取圖像空間到物體空間變換的旋轉矩陣
void?Composite(float?*rgbaint?x0int?y0float?*CDataint?*Dimfloat?*Rfloat?*T);//合成像素顏色值
bool?Intersection(float?*startpos?float?*pos?float?*dirint?*Dim);//求光線與包圍盒交點坐標
void?TrInterpolation(float?*rgbafloat?*posfloat?*CDataint?*Dim);//三線性插值
bool?CheckinBox(float?*pointint?*Dim);//判斷點是否在包圍盒內
void?MatrixmulVec(float?*cfloat?*afloat?*b);//矩陣向量乘積
void?CrossProd(float?*cfloat?*afloat?*b);//向量叉乘
void?Normalize(float?*normfloat?*a);//向量歸一化
void?Mydisplay();//顯示圖像
int?main(int?argcchar?**argv)
{
int?Dim[3]={200200200};//體數據大小
int?*Data=(int?*)malloc(sizeof(int)*Dim[0]*Dim[1]*Dim[2]);
float?*CData=(float*)malloc(sizeof(float)*Dim[0]*Dim[1]*Dim[2]*4);
float?R[9];//旋轉矩陣
float?T[3]={00450};//平移向量(要根據R調整,以保證獲得體數據全貌)
float?eye[3]={0.50.51};//視點位置
float?center[3]={000};//物體參考點位置
float?up[3]={010};//相機朝上的方向
RotationMatrix(Reyecenterup);//獲得旋轉矩陣
GenerateVolume(DataDim);//生成原始體數據
Classify(CDataDataDim);//對體數據分類
float?*LinePS=Image;
for(int?j=0;j {
for(int?i=0;i {
Composite(LinePSijCDataDimRT);
LinePS+=4;
}
}
free(Data);
free(CData);
//使用OpenGL顯示此二維圖像
glutInit(&argcargv);
glutInitDisplayMode(GLUT_SINGLE?|?GLUT_RGBA);
glutInitWindowSize(500500);
glutInitWindowPosition(200200);
glutCreateWindow(“Ray-Casting“);
glClearColor?(1111);//背景設為白色
glutDisplayFunc(Mydisplay);//顯示圖像
glutMainLoop();
}
//生成體數據
//********************************************************************//
//生成一個大正方體,內部包含一個球體,球體中間又包含一個小正方體
//Data:體積數據
//Dim:體數據大小
//********************************************************************//
void?GenerateVolume(int?*Dataint?*Dim)
{
GenCube(000200100DataDim);//大正方體
GenSphere(10010010080200DataDim);//球體
GenCube(70707060300DataDim);//小正方體
}
//生成正方體數據
//********************************************************************//
//xyz:正方體左下角坐標
//side:正方體邊長
//density:正方體對應的標量值
//Data:體積數據
//Dim:體數據大小
//********************************************************************//
void?GenCube(int?xint?yint?zint?sideint?density?int?*Dataint?*Dim)
{
int?max_x=x+sidemax_y=y+sidemax_z=z+side;
int?Dimxy=Dim[0]*Dim[1];
for(int?k=z;k {
for(int?j=y;j {
for(int?i=x;i {
Data[k*Dimxy+j*Dim[0]+i]=density;
}
}
}
}
//生成球體數據
//***********************************************************
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件??????40448??2016-01-29?19:50??RayCasting\Debug\RayCasting.exe
?????文件?????343796??2016-01-29?19:50??RayCasting\Debug\RayCasting.ilk
?????文件?????396288??2016-01-29?19:50??RayCasting\Debug\RayCasting.pdb
?????文件??????12802??2016-01-29?19:50??RayCasting\RayCasting\main.cpp
?????文件???????3920??2016-01-29?19:50??RayCasting\RayCasting\RayCasting.vcxproj
?????文件????????942??2016-01-29?19:50??RayCasting\RayCasting\RayCasting.vcxproj.filters
?????文件????????143??2016-01-29?19:47??RayCasting\RayCasting\RayCasting.vcxproj.user
?????文件????????897??2016-01-29?19:47??RayCasting\RayCasting.sln
????..A..H.?????11264??2016-01-29?19:50??RayCasting\RayCasting.suo
?????目錄??????????0??2016-01-29?19:50??RayCasting\Debug
?????目錄??????????0??2016-01-29?19:51??RayCasting\RayCasting
?????目錄??????????0??2016-01-29?19:51??RayCasting
-----------?---------??----------?-----??----
???????????????810500????????????????????12
- 上一篇:七參數的計算
- 下一篇:pls_graph使用手冊
評論
共有 條評論