-
大小: 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
- 上一篇:七参数的计算
- 下一篇:pls_graph使用手册
评论
共有 条评论