private void SetLiquidHeight() { float volume = cLGameObject.cl_object.Liquidvolume; float height = minheight; if (volume == 0) { liquidheight = height; return; } var hr = this.liquidMesh.HR; for (int i = 0; i < hr.Count - 1 && volume != 0; i++) { //计算出第每层的体积,与实际体积volume比较 //如果实际体积大,则height=height+该层高度,volume=volume-该层体积 //否则根据该层的参数 以及volume 计算出真实高度 //此层高度 float h = hr[i + 1].x - hr[i].x; //此层体积 float vol = 0.5f * Mathf.PI * (hr[i].y * hr[i].y + hr[i + 1].y * hr[i + 1].y) * h; if (volume < vol) { Vector2 point1 = new Vector2(0, hr[i].y); Vector2 point2 = new Vector2(h, hr[i + 1].y); LinearFunction linear = new LinearFunction(point1, point2); float k = linear.GetK(); float realh; if (k == 0) { realh = volume / vol * h; } else if (k > 0) { float th = h - linear.GetX(0); float tv = 1f / 3f * Mathf.PI * hr[i + 1].y * hr[i + 1].y * th; float v1 = tv - vol + volume; float h1 = Mathf.Pow((3f * v1) / (k * k * Mathf.PI), 1f / 3f); realh = h1 + linear.GetX(0); } else { float th = linear.GetX(0); float tv = 1f / 3f * Mathf.PI * hr[i].y * hr[i].y * th; float v1 = tv - volume; float h1 = Mathf.Pow((3f * v1) / (k * k * Mathf.PI), 1f / 3f); realh = th - h1; } height += realh; volume = 0; } else { if (i == hr.Count - 2) { height += volume / vol * h; volume = 0; } else { height += h; volume -= vol; } } } liquidheight = height; }