• 大小: 122KB
    文件类型: .rar
    金币: 1
    下载: 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


评论

共有 条评论

相关资源