Я хочу создать трехмерный визуализатор медицинских наборов данных .raw, используя марширующие тетраэдры.
Я нашел эту реализацию по лицензии GPL , которая выглядит красиво и основана на информации Пола Бурка, но я не знаю, как заставить работать файл .raw, который я нашел человек загружается как 3d текстура .
//assuming that the data at hand is a 256x256x256 unsigned byte data
int XDIM=256, YDIM=256, ZDIM=256;
const int size = XDIM*YDIM*ZDIM;
bool LoadVolumeFromFile(const char* fileName) {
FILE *pFile = fopen(fileName,"rb");
if(NULL == pFile) {
return false;
}
GLubyte* pVolume=new GLubyte[size]; //<- here pVolume is a 1D byte array
fread(pVolume,sizeof(GLubyte),size,pFile);
fclose(pFile);
// now pVolume is passed to a 3d texture
//load data into a 3D texture
glGenTextures(1, &textureID);
glBindTexture(GL_TEXTURE_3D, textureID);
// set the texture parameters
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_S, GL_CLAMP);
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_T, GL_CLAMP);
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_R, GL_CLAMP);
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexImage3D(GL_TEXTURE_3D,0,GL_INTENSITY,XDIM,YDIM,ZDIM,0,GL_LUMINANCE,GL_UNSIGNED_BYTE,pVolume);
delete [] pVolume;
return true;
}
Я не знаю, должен ли я тоже:
а) получить доступ к значениям напрямую из pValue
б) получить доступ к ним после загрузки их в 3D-текстуру
Я понятия не имею, как я должен индексировать pVolume, чтобы получить интенсивность изоповерхности в каждом x, y, z. если pVolume является одномерным массивом. Я знаю, что координаты x, y отображаются из одномерного массива с использованием деления и модуля, но как бы я отобразил x, y, z?
С другой стороны, если я загружу файл .raw в качестве 3d-текстуры,
glTexCoord3f
дайте мне значение в данном x, y, z?
Пояснение: вопрос не в том, "может ли OpenGL нарисовать изоповерхность непосредственно из этого?" вопрос заключается в том, как индексировать изоуровни по геометрии .raw, что необходимо для правильной оценки каждого тетраэдра. На изображении видно, что каждый случай тетраэдра отмечен в зависимости от того, находится ли изоповерхность над или под ней. Изоповерхность индексируется по координатам x, y, z в файле .raw, как я могу получить к ней доступ для каждого x, y, z в наборе данных? Даст ли мне glTexCoord3f свою интенсивность на данном x, y, z? Что лучше сделать преобразование x, y, z из массива pVolume напрямую?