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



如果游戏对象中有另一个对象,我试图让它与声音反应。我希望游戏对象使用输入对象的位置,然后查看最接近的体素,然后根据体素强度/颜色播放音频。有人有什么想法吗?我正在使用一个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;
}

您可以尝试设置大量的长方体碰撞器,并在每个碰撞器上运行OnTriggerEnter((函数。但一个更好的解决方案是对体素阵列进行排序,然后使用简单的数学运算将移动对象的位置向量钳制为int,并进行一些数学运算将向量映射到阵列中的索引。例如,向量(0,0,0(可以映射到体素[0]。然后根据需要获取体素属性。对于体素应用程序来说,这将是一个比对撞机更快的计算。

我想我已经想通了。如果有人看到我的编码有任何缺陷,请告诉我:(。

public Vector3Int GetIndexFromWorld(Vector3 worldPos)
{
Vector3 deltaBounds = rend.bounds.max - rend.bounds.min;
Vector3 OffsetPos = worldPos - rend.bounds.min;
Vector3 normPos = new Vector3(OffsetPos[0] / deltaBounds[0], OffsetPos[1] / deltaBounds[1], OffsetPos[2] / deltaBounds[2]);
Vector3 voxelPositions = new Vector3(normPos[0] * voxelDims[0], normPos[1] * voxelDims[1], normPos[2] * voxelDims[2]);
Vector3Int voxelPos = Vector3Int.FloorToInt(voxelPositions);
return voxelPos;
}

相关内容

最新更新