在 unity 中,如何在给定的世界空间位置找到体素信息?

问题描述

如果另一个对象在里面,我试图让一个统一的游戏对象对声音做出反应。我希望游戏对象使用输入对象的位置来查看最接近的体素,然后根据体素强度/颜色播放音频。有没有人有任何想法?我正在处理一个 512x256x512 体素的数据集。如果对象也被调整大小,我希望它能够工作。非常感谢任何帮助:)

我使用的数据集是身体的 3d .mhd 医学扫描。以下是在启动时将纹理添加到渲染器的方式:

for (int k = 0; k < NumberOfFrames; k++) {
    string fname_ = "T" + k.ToString("D2");
    Color[] colors = LoadData(Path.Combine (imageDir,fname_+".raw"));
    _volumeBuffer.Add (new Texture3D (dim [0],dim [1],dim [2],TextureFormat.RGBAHalf,mipmap));

    _volumeBuffer[k].SetPixels(colors);
    _volumeBuffer [k].Apply ();
}
GetComponent<Renderer>().material.SetTexture("_Data",_volumeBuffer[0]);

对象的大小是通过使用 mdh 头文件间距以及体素尺寸来定义的:

transform.localScale = new Vector3(mhdheader.spacing[0] * volScale,mhdheader.spacing[1] * volScale * dim[1] / dim[0],mhdheader.spacing[2] * volScale * dim[2] / dim[0]);

我尝试制作我自己的函数,通过将它偏移到渲染网格的开头来从世界中获取索引(不确定这是否正确)。然后,按局部比例缩放。然后,乘以每个维度的体素数量。但是,我不确定我的逻辑是否正确......这是我尝试过的代码:

public Vector3Int GetIndexFromWorld(Vector3 worldPos)
{
    Vector3 startOfTex = gameObject.GetComponent<Renderer>().bounds.min;
    Vector3 localPos = transform.InverseTransformPoint(worldPos);
    Vector3 localScale = gameObject.transform.localScale;
    Vector3 OffsetPos = localPos - startOfTex;

    Vector3 VoxelPosFloat = new Vector3(OffsetPos[0] / localScale[0],OffsetPos[1] / localScale[1],OffsetPos[2] / localScale[2]);
    VoxelPosFloat = Vector3.Scale(VoxelPosFloat,new Vector3(voxelDims[0],voxelDims[1],voxelDims[2]));
    Vector3Int voxelPos = Vector3Int.FloorToInt(VoxelPosFloat);
    return voxelPos;
}

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)