-
大小: 799KB文件类型: .rar金币: 1下载: 0 次发布日期: 2021-06-19
- 语言: 其他
- 标签: Ray-Casting 光线跟踪 DRR raycast
资源简介
这是我的一个课程作业,实现了体数据可视化显示中的Ray casting(光线跟踪)经典算法。本程序简单易懂,对于理解算法有很好的帮助。里面实现了如下三种方法,同时内附测试体数据。下载后点击release文件夹中exe文件即可看到效果。
一、基于表面光照的三维显示方法(SSD)。基本原理:三维物体表面的检测隐含在光线跟踪处理中,在给定的表面条件满足时,光线停止,同时在光线与物体相交处计算表面法线方向矢量,然后利用光照模型计算亮度值,赋给相应的绘制值,形成光照效果的三维表面显示;
二、最大值投影方法(MIP)。基本原理:将所有体素沿视线方向投影到相应像素中的体素的最大值作为最终像素的值,主要应用于MRA 和Ultrasound 中;三、数字重建透视成像(DRR)。基本原理:与MIP 相类似,在遍历光线的过程中将光线路径上的图像值进行累加,又称为数字重建透视成像。
代码片段和文件信息
// OpenGL.cpp : implementation file
//
#include “stdafx.h“
#include “RayCasting_work2.h“
#include “OpenGL.h“
#include
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// COpenGL
COpenGL::COpenGL()
{
// 给成员变量赋值
step = 0.0;
s = 0.1;
rc = new CRayCastUtility();
rc->Open();
}
COpenGL::~COpenGL()
{
if(rc!=NULL) delete rc;
wglMakeCurrent(NULLNULL);
wglDeleteContext(hglrc); // 删除渲染描述表
::ReleaseDC(m_hWndhdc); // 释放设备描述表
}
BEGIN_MESSAGE_MAP(COpenGL CWnd)
//{{AFX_MSG_MAP(COpenGL)
ON_WM_CREATE()
ON_WM_PAINT()
//}}AFX_MSG_MAP
ON_WM_TIMER()
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// COpenGL message handlers
int COpenGL::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CWnd::OnCreate(lpCreateStruct) == -1)
return -1;
// TODO: Add your specialized creation code here
// 设置当前的绘图像素格式
MySetPixelFormat(::GetDC(m_hWnd));
CPaintDC dc(this); // device context for painting
// 创建绘图描述表
hdc = ::GetDC(m_hWnd);
// 创建渲染描述表
hglrc = wglCreateContext(hdc);
// 使绘图描述表为当前调用线程的当前绘图描述表
wglMakeCurrent(hdchglrc);
SetTimer(1600NULL);//启动定时器1定时时间是1秒
return 0;
}
void COpenGL::OnPaint()
{
CPaintDC dc(this); // device context for painting
// TODO: Add your message handler code here
// Do not call CWnd::OnPaint() for painting messages
// 调用OpenGL 绘图函数进行图形绘制
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // 清除颜色缓存和深度缓存
//s+=0.0005;
if(s>1.0)
s=0.1;
step = step+1.0;
if(step>360.0)
step=step-360.0;
glPushMatrix();
/*glScalef(sss);
glRotatef(step0.01.00.0);
glRotatef(step0.00.01.0);
glRotatef(step1.00.00.0);*/
//DrawColorBox();
glPopMatrix();
glFlush();
SwapBuffers(hdc);
}
// 设置像素格式函数
int COpenGL::MySetPixelFormat(HDC hdc)
{
PIXELFORMATDEscriptOR pfd={
sizeof(PIXELFORMATDEscriptOR) // pfd结构的大小
1 // 版本号
PFD_DRAW_TO_WINDOW | // 支持在窗口中绘图
PFD_SUPPORT_OPENGL | // 支持opengl
PFD_DOUBLEBUFFER // 双缓存模式
PFD_TYPE_RGBA // RGBA 颜色模式
24 // 24 位颜色深度
0 0 0 0 0 0 // 忽略颜色位
0 // 没有非透明度缓存
0 // 忽略移位位
0 // 无累加缓存
0 0 0 0 // 忽略累加位
32 // 32位深度缓存
0 // 无模板缓存
0 // 无辅助缓存
PFD_MAIN_PLANE // 主层
0 // 保留
0 0 0 // 忽略层,可见性和损毁掩模
};
int iPixelFormat;
// 为设备描述表得到最匹配的像素格式
if((iPixelFormat = ChoosePixelFormat(hdc&pfd)) == 0)
{
MessageBox(_T(“ChoosePixelFormat Failed“)NULLMB_OK);
return 0;
}
// 设置最匹配的像素格式为当前的像素格式
if(SetPixelFormat(hdciPixelFormat&pfd) == FALSE)
{
MessageBox(_T(“SetPixelFormat Failed“)NULLMB_OK);
return 0;
}
return 1;
}
void COpenGL::DrawColorBox()
{
GLfloat x;
GLfloat factor = s;
//glClear(GL_COLOR_BUFFER_BIT);
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 4305 2011-12-09 11:07 RayCasting_work2\RayCasting_work2\OpenGL.cpp
文件 1534 2011-12-09 11:07 RayCasting_work2\RayCasting_work2\OpenGL.h
文件 1198 2011-12-05 14:43 RayCasting_work2\RayCasting_work2\raycast\color.cpp
文件 1359 2002-10-25 14:42 RayCasting_work2\RayCasting_work2\raycast\color.h
文件 1870 2011-12-05 14:43 RayCasting_work2\RayCasting_work2\raycast\CreateVolDat.cpp
文件 695 2011-12-05 14:43 RayCasting_work2\RayCasting_work2\raycast\CreateVolDat.h
文件 913 2011-12-05 14:54 RayCasting_work2\RayCasting_work2\raycast\openglsupport.h
文件 11822 2011-12-06 21:04 RayCasting_work2\RayCasting_work2\raycast\ray.cpp
文件 2390 2002-10-25 14:42 RayCasting_work2\RayCasting_work2\raycast\ray.h
文件 3510 2011-12-05 14:56 RayCasting_work2\RayCasting_work2\raycast\raycaster.cpp
文件 675 2002-10-25 14:42 RayCasting_work2\RayCasting_work2\raycast\raycaster.h
文件 3035 2011-12-09 11:07 RayCasting_work2\RayCasting_work2\raycast\RayCastUtility.cpp
文件 883 2011-12-09 11:07 RayCasting_work2\RayCasting_work2\raycast\RayCastUtility.h
文件 2831 2002-10-25 14:42 RayCasting_work2\RayCasting_work2\raycast\resource.h
文件 8843 2011-11-23 21:33 RayCasting_work2\RayCasting_work2\raycast\shearwarp.cpp
文件 988 2002-10-26 16:55 RayCasting_work2\RayCasting_work2\raycast\shearwarp.h
文件 4546 2002-10-25 14:42 RayCasting_work2\RayCasting_work2\raycast\slicer.cpp
文件 1114 2002-10-25 14:42 RayCasting_work2\RayCasting_work2\raycast\slicer.h
文件 3393 2011-12-05 14:59 RayCasting_work2\RayCasting_work2\raycast\tfvolume.cpp
文件 706 2011-12-06 18:12 RayCasting_work2\RayCasting_work2\raycast\tfvolume.h
文件 1976 2011-12-06 21:05 RayCasting_work2\RayCasting_work2\raycast\transfunc.cpp
文件 837 2011-12-06 18:12 RayCasting_work2\RayCasting_work2\raycast\transfunc.h
文件 7362 2002-10-25 14:42 RayCasting_work2\RayCasting_work2\raycast\transfuncwin.cpp
文件 1453 2011-12-05 14:48 RayCasting_work2\RayCasting_work2\raycast\transfuncwin.h
文件 6113 2002-10-25 14:42 RayCasting_work2\RayCasting_work2\raycast\vecmath.cpp
文件 1760 2002-10-25 14:42 RayCasting_work2\RayCasting_work2\raycast\vecmath.h
文件 25410 2011-12-05 15:00 RayCasting_work2\RayCasting_work2\raycast\volume.cpp
文件 3407 2002-10-25 14:42 RayCasting_work2\RayCasting_work2\raycast\volume.h
文件 58128 2011-12-09 11:09 RayCasting_work2\RayCasting_work2\RayCasting_work2.aps
文件 1777 2011-12-03 10:14 RayCasting_work2\RayCasting_work2\RayCasting_work2.cpp
............此处省略30个文件信息
评论
共有 条评论