c# - 计算非典型物体的宽度、高度和体积
问题描述
我有非典型对象,我想计算它的宽度、高度和体积。为了音量,我得到了这个脚本
public class MeshVolume : MonoBehaviour
{
void Start()
{
Mesh mesh = GetComponent<MeshFilter>().sharedMesh;
float volume = VolumeOfMesh(mesh);
string msg = "The volume of the mesh is " + volume + " cube units.";
Debug.Log(msg);
}
public float SignedVolumeOfTriangle(Vector3 p1, Vector3 p2, Vector3 p3)
{
float v321 = p3.x * p2.y * p1.z;
float v231 = p2.x * p3.y * p1.z;
float v312 = p3.x * p1.y * p2.z;
float v132 = p1.x * p3.y * p2.z;
float v213 = p2.x * p1.y * p3.z;
float v123 = p1.x * p2.y * p3.z;
return (1.0f / 6.0f) * (-v321 + v231 + v312 - v132 - v213 + v123);
}
public float VolumeOfMesh(Mesh mesh)
{
float volume = 0;
Vector3[] vertices = mesh.vertices;
int[] triangles = mesh.triangles;
for (int i = 0; i < mesh.triangles.Length; i += 3)
{
Vector3 p1 = vertices[triangles[i + 0]];
Vector3 p2 = vertices[triangles[i + 1]];
Vector3 p3 = vertices[triangles[i + 2]];
volume += SignedVolumeOfTriangle(p1, p2, p3);
}
return Mathf.Abs(volume);
}
}
因为我不是数学家,所以我无法验证它是否工作正常,但有一点很清楚,如果我放大或缩小对象,它不会更新体积计算。那么这是计算物体体积的正确方法吗?其次,我使用 meshRenderer 边界获取对象的宽度和高度
Bounds meshBounds = GetComponent<MeshRenderer>().bounds;
float width = meshBounds.size.x;
float height = meshBounds.size.y;
这是计算宽度和高度的正确方法吗?我怎样才能交叉检查它。
解决方案
我已经通过 revit 工具检查了宽度、高度和体积。
对于宽度、高度和呼吸:
Bounds meshBounds = GetComponent<MeshRenderer>().bounds;
float width = meshBounds.size.x;
float height = meshBounds.size.y;
float breath = meshBounds.size.z
就我而言,我采用了 MeshRendere 边界,您也可以通过 Collider 计算它。
对于音量:
public float SignedVolumeOfTriangle(Vector3 p1, Vector3 p2, Vector3 p3)
{
float v321 = p3.x * p2.y * p1.z;
float v231 = p2.x * p3.y * p1.z;
float v312 = p3.x * p1.y * p2.z;
float v132 = p1.x * p3.y * p2.z;
float v213 = p2.x * p1.y * p3.z;
float v123 = p1.x * p2.y * p3.z;
return (1.0f / 6.0f) * (-v321 + v231 + v312 - v132 - v213 + v123);
}
public float VolumeOfMesh(Mesh mesh)
{
float volume = 0;
Vector3[] vertices = mesh.vertices;
int[] triangles = mesh.triangles;
for (int i = 0; i < mesh.triangles.Length; i += 3)
{
Vector3 p1 = vertices[triangles[i + 0]];
Vector3 p2 = vertices[triangles[i + 1]];
Vector3 p3 = vertices[triangles[i + 2]];
volume += SignedVolumeOfTriangle(p1, p2, p3);
}
return Mathf.Abs(volume);
}
推荐阅读
- python - 在 Tensorflow 中过滤张量元素
- macos - Gzipping 删除了 MacOS 中由 codesign 签名的文件签名
- flutter - 由于某种原因不能使用flutter_bloc
- python - 如何将分钟和小时的刻度添加到对数秒的 y 轴?
- c++ - Windows C++ API:如何将整个二进制文件读入缓冲区?
- ncurses - wgetch 未检测到 KEY_UP 等
- sql - 比较 3 个 SQL Server 表,一旦根据某个属性匹配,则将结果放在一个表中,当不匹配时将结果放在另一个表中
- javascript - 为什么迭代 Set 的值会分配和创建垃圾?
- windows - 使用 Windows 终端的 Cmder 错误颜色
- date - 返回人的最近日期,查看两列中的日期?谷歌表格