我是jogl的新手。我正在编写DICOM图像的3D渲染。使用jogl进行3D渲染时,我创建了粗略的3D视图。遵循的步骤如下:
为每张图片创建纹理。
// Create a OpenGL Texture object
for(int i=0;i<image.length;i++)
{
textures[i] = AWTTextureIO.newTexture(GLProfile.getDefault(), image[i], false);
textureCoords = textures[i].getImageTexCoords();
textureTop[i] = textureCoords.top();
textureBottom[i] = textureCoords.bottom();
textureLeft[i] = textureCoords.left();
textureRight[i] = textureCoords.right();
}
通过一个接一个地放置这些图像来创建这些图像的立方体。
int x=numberOfImages;
gl.glBegin(GL_QUADS);
// To place stack back to front
for(float i=-numberOfImages*0.0050f;x>0;i=i+0.01f){
// Enables this texture's target in the current GL context's state.
textures[currTextureFilter].enable(gl);
// Bind the texture with the currently chosen filter to the current OpenGL graphics context.
textures[currTextureFilter].bind(gl);
gl.glBegin(GL_QUADS); // of the color cube
gl.glNormal3f(0.0f, 0.0f, (0.1f+i));
gl.glTexCoord2f(textureLeft[x], textureBottom[x]);
gl.glVertex3f(-1.0f, -1.0f, (0.1f+i)); // bottom-left of the texture and quad
gl.glTexCoord2f(textureRight[x], textureBottom[x]);
gl.glVertex3f(1.0f, -1.0f, (0.1f+i)); // bottom-right of the texture and quad
gl.glTexCoord2f(textureRight[x], textureTop[x]);
gl.glVertex3f(1.0f, 1.0f, (0.1f+i)); // top-right of the texture and quad
gl.glTexCoord2f(textureLeft[x], textureTop[x]);
gl.glVertex3f(-1.0f, 1.0f, (0.1f+i)); // top-left of the texture and quad
currTextureFilter =x;
textures[currTextureFilter].disable(gl);
x--;
gl.glFlush();
gl.glEnd();
}
为3D图像提供旋转,缩放等设施。
在旋转3D视图时,图像的光强度会减小,并且在某个角度会出现黑条。当我缩放该部分时,它显示2张图像中的间隙。 我在任何一步都出错了吗?请指导我。提前谢谢。
答案 0 :(得分:1)
如果您在相对于数据集的固定方向上绘制切片,只要您的查看方向与切片或多或少正交,这将相当有效。从其他角度来看,结果将日益恶化。
在极端情况下,您的查看方向与切片位于同一平面中,您基本上什么也看不见,因为您会看到多边形边缘。
至于如何正确有效地进行体积渲染,这是一个非常广泛的领域。有关于该主题的全书。部分非常昂贵的商业解决方案,其中许多实际上并没有那么好。
只是为您提供一个起点:一种基本方法是将数据存储在3D纹理中,然后绘制始终与查看方向正交的切片平面。