java - vtk java体素渲染

标签 java vtk voxel voxels

大家好,

有谁知道,为什么 Java 中的这段代码可以编译, 但出现错误:

"An unrecoverable stack overflow has occurred.
#
# A fatal error has been detected by the Java Runtime Environment:
#
#  EXCEPTION_STACK_OVERFLOW (0xc00000fd) at pc=0x5d05b377, pid=4576, tid=4888
#
# JRE version: 6.0_20-b02
# Java VM: Java HotSpot(TM) Client VM (16.3-b01 mixed mode windows-x86 )
# Problematic frame:
# C  [vtkVolumeRendering.dll+0x2eb377]
#
# An error report file with more information is saved as:
# D:\Programme\eclipse-workspace\bachelorarbeit_01\hs_err_pid4576.log
#
# If you would like to submit a bug report, please visit:
#   http://java.sun.com/webapps/bugreport/crash.jsp
# The crash happened outside the Java Virtual Machine in native code.
# See problematic frame for where to report the bug."

这是我从 C++ 代码复制而来的 Java 源代码: http://permalink.gmane.org/gmane.comp.lib.vtk.user/35844

import vtk.vtkImageData;
import vtk.vtkUnstructuredGrid;
import vtk.vtkPolyDataMapper;
import vtk.vtkActor;
import vtk.vtkRenderWindow;
import vtk.vtkRenderWindowInteractor;
import vtk.vtkRenderer;
import vtk.vtkPoints;
import vtk.vtkVolume;
import vtk.vtkVoxel;
import vtk.vtkDataSetTriangleFilter;
import vtk.vtkUnstructuredGridVolumeRayCastMapper;
import vtk.vtkPiecewiseFunction;
import vtk.vtkVolumeProperty;
import vtk.vtkColorTransferFunction;
import vtk.vtkExtractEdges;
import vtk.vtkDoubleArray;
import vtk.vtkCellData;

public class Visualizer {

    public Visualizer()
    {

        int nbVoxels = 3*3*3;
        int voxelSize = 1;

        vtkPoints voxelPoints = new vtkPoints();
        voxelPoints.SetNumberOfPoints(8*nbVoxels);
        voxelPoints.SetDataTypeToDouble();

        vtkUnstructuredGrid grid = new vtkUnstructuredGrid();
        grid.Allocate(nbVoxels, voxelSize);

        vtkVoxel voxel = new vtkVoxel();

        int count = 0;
        int posX = 0;
        int posY = 0;
        int posZ = 0;

        for ( int v=0; v<nbVoxels ; v++ )
        {
                voxelPoints.InsertPoint(count*8+0, posX, posY, posZ);
                voxelPoints.InsertPoint(count*8+1, posX+voxelSize,  posY, posZ);
                voxelPoints.InsertPoint(count*8+2, posX, posY+voxelSize, posZ);
                voxelPoints.InsertPoint(count*8+3, posX+voxelSize,  posY+voxelSize, posZ);
                voxelPoints.InsertPoint(count*8+4, posX, posY, posZ+voxelSize);
                voxelPoints.InsertPoint(count*8+5, posX+voxelSize, posY, posZ+voxelSize);
                voxelPoints.InsertPoint(count*8+6, posX, posY+voxelSize, posZ+voxelSize);
                voxelPoints.InsertPoint(count*8+7, posX+voxelSize, posY+voxelSize, posZ+voxelSize);

                voxel.GetPointIds().SetId(0, count*8+0);
                voxel.GetPointIds().SetId(1, count*8+1);
                voxel.GetPointIds().SetId(2, count*8+2);
                voxel.GetPointIds().SetId(3, count*8+3);
                voxel.GetPointIds().SetId(4, count*8+4);
                voxel.GetPointIds().SetId(5, count*8+5);
                voxel.GetPointIds().SetId(6, count*8+6);
                voxel.GetPointIds().SetId(7, count*8+7);

                grid.InsertNextCell(11, voxel.GetPointIds());

                count++;

                posX += voxelSize;
                if ( posX == 3*voxelSize )
                {
                        posX = 0;
                        posY += voxelSize;
                        if ( posY == 3*voxelSize )
                        {
                                posY = 0;
                                posZ += voxelSize;
                        }
                }
        }
        grid.SetPoints(voxelPoints);



      //extract edges from unstructured grid
        vtkExtractEdges edges = new vtkExtractEdges();
        edges.SetInput(grid);

        vtkPolyDataMapper gridMapper = new vtkPolyDataMapper();
        gridMapper.SetInput(edges.GetOutput());

        vtkActor gridActor = new vtkActor();
        gridActor.SetMapper(gridMapper);
        gridActor.GetProperty().SetColor(0.0,0.0,0.0);

        vtkDoubleArray colourPts = new vtkDoubleArray();
        for(int i=0; i < nbVoxels; i++)
                colourPts.InsertNextValue(i);

        vtkCellData cellData = grid.GetCellData();
        cellData.SetNumberOfTuples(nbVoxels);
        cellData.SetScalars(colourPts);

      //create a transfer function mapping scalar value to color
        vtkColorTransferFunction fColor = new vtkColorTransferFunction();

        for (int idx = 0; idx < nbVoxels; idx++)
        {
                        fColor.AddRGBPoint(colourPts.GetValue(idx),1, 0, 0);
        }

        vtkPiecewiseFunction fOpacity = new vtkPiecewiseFunction();
        fOpacity.AddPoint(0, 1);
        fOpacity.AddPoint(nbVoxels, 1);

        vtkVolumeProperty volProp = new vtkVolumeProperty();
        volProp.SetColor(fColor);
        volProp.SetScalarOpacity(fOpacity);

        vtkDataSetTriangleFilter filter = new vtkDataSetTriangleFilter();
        filter.SetInput(grid);

        vtkUnstructuredGridVolumeRayCastMapper vrcm = new vtkUnstructuredGridVolumeRayCastMapper();
        vrcm.SetInput(filter.GetOutput());

        vtkVolume volume = new vtkVolume();
        volume.SetMapper(vrcm);
        volume.SetProperty(volProp);

        vtkRenderer renderer = new vtkRenderer();
        vtkRenderWindow renderWindow = new vtkRenderWindow();
        renderWindow.AddRenderer(renderer);

        vtkRenderWindowInteractor renderWindowInteractor = new vtkRenderWindowInteractor();
        renderWindowInteractor.SetRenderWindow(renderWindow);

        renderer.AddActor(volume);
        renderer.AddActor(gridActor);
        renderer.SetBackground(1,1,1);
        //renderer.ResetCamera();

        renderWindow.Render();
        renderWindowInteractor.Start();     

    }

}

感谢您的帮助!

大卫

最佳答案

消息

崩溃发生在本地代码中的 Java 虚拟机之外。

应该会提示您错误发生在 java 之外,因此查看 java 代码很可能帮不上什么忙。

堆栈溢出的典型原因(无论使用何种语言)是递归调用永远不会达到基本情况,因此永远不会开始回溯。这样做的原因是每次对该方法的调用都会导致返回地址(引用)被放置在堆栈上,调用越多,存储的返回地址就越多,直到堆栈上没有更多空间为止。

在其他时间用 vtkVolumeRendering.dll 和 found this if it's any help. 快速搜索了一下

如果上面的链接不起作用:)

http://vtk.1045678.n5.nabble.com/vtkFixedPointVolumeRayCastMapper-Problem-in-java-td1244838.html

关于java - vtk java体素渲染,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3329278/

相关文章:

java - 如何解决 IllegalStateException : Failed to load ApplicationContext

java - 有没有一种方法可以通用地测量物体的大小或长度?

java - 为什么我的输出文件名为 'part-r-xxxxx' ,即使我没有提到任何 reducer 类?

python - 如何从 tvtk PolyData 实例中提取顶点数据?

c++ - 使用 MITK 绘制点/线

java - LWJGL - 隐藏时隐藏立方体面

java - 如何在 Java 中将@写成字符串

c++ - 两个 Actor 的交集 - Vtk

java - 使用单个 VBO 创建体素 block - 如何平移每个 block 的坐标并将其添加到 VBO block ?