LOD高亮轮廓

This commit is contained in:
huqibin 2025-05-29 14:38:48 +08:00
parent b2af23d2e1
commit ca784f5b86
3 changed files with 843 additions and 242 deletions

File diff suppressed because it is too large Load Diff

View File

@ -1,5 +1,7 @@
using HighlightPlus;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
using UnityEngine.SocialPlatforms;
@ -18,6 +20,8 @@ public class SorghumController : PermanentTriggerBase
public bool RandomRotate = true;
LODGroup lodGroup = null;
public void Init(SorghumState _state = SorghumState.Healthy, bool _rand = false)
{
State = _state;
@ -43,10 +47,12 @@ public class SorghumController : PermanentTriggerBase
case SorghumState.Diseased:
triggerName = "高粱_病株";
this.gameObject.name = "高粱_病株";
lodGroup = DiseasedStrain.GetComponent<LODGroup>();
break;
case SorghumState.Healthy:
triggerName = "高粱_正常";
this.gameObject.name = "高粱_正常";
lodGroup = HealthyStrain.GetComponent<LODGroup>();
break;
}
@ -99,14 +105,50 @@ public class SorghumController : PermanentTriggerBase
base.OnMEnter();
//if (GameManager.RunModelMgr?.ModeType != E_ModeType.Study)
//{
_highlight.SetHighlighted(true);
_highlight = GetComponentInChildren<HighlightEffect>();
if (_highlight != null)
_highlight.SetHighlighted(true);
//Debug.Log("当前渲染:" + GetLODCurShowLevel(Camera.main, lodGroup));
//}
}
int GetLODCurShowLevel(Camera cam, LODGroup lodGroup)
{
var inv_SceneViewCamHeight = 1.0f / (cam.pixelHeight - 6.0f);
var lods = lodGroup.GetLODs();
for (int lodIDX = 0; lodIDX < lods.Length; lodIDX++)
{
var lod = lods[lodIDX];
var renderers = lod.renderers;
for (int renderIDX = 0; renderIDX < renderers.Length; renderIDX++)
{
var renderer = renderers[renderIDX];
var heightInScreen = cam.WorldToScreenPoint(renderer.bounds.min).y - cam.WorldToScreenPoint(renderer.bounds.max).y;
var ratioInScren = Mathf.Abs(heightInScreen * inv_SceneViewCamHeight);
if (ratioInScren > lod.screenRelativeTransitionHeight)
{
return lodIDX;
}
}
}
return -1;
}
private float CalculateScreenRelativeHeight(float objectSize, float distance, float fov)
{
// 计算物体在屏幕上的高度比例
float screenHeight = 2.0f * Mathf.Tan(0.5f * fov * Mathf.Deg2Rad) * distance;
return objectSize / screenHeight;
}
protected override void OnMExit()
{
//if (GameManager.RunModelMgr?.ModeType != E_ModeType.Study)
_highlight.SetHighlighted(false);
if (_highlight != null)
_highlight.SetHighlighted(false);
base.OnMExit();
}

View File

@ -167,16 +167,16 @@ public class SorghumFieldController : MonoBehaviour
private void SetRenderersEnabled(bool enabled, GameObject go)
{
GameObject obj = go;
if (obj == null) obj = this.gameObject;
Renderer[] renderers = go.GetComponentsInChildren<Renderer>();
foreach (Renderer r in renderers)
{
r.enabled = enabled;
}
//GameObject obj = go;
//if (obj == null) obj = this.gameObject;
//Renderer[] renderers = go.GetComponentsInChildren<Renderer>();
//foreach (Renderer r in renderers)
//{
// r.enabled = enabled;
//}
LODGroup lg = go.GetComponent<LODGroup>();
Debug.Log("LOD×éÊý£º" + lg.GetLODs().Length);
//LODGroup lg = go.GetComponent<LODGroup>();
//Debug.Log("LOD×éÊý£º" + lg.GetLODs().Length);
//Renderer[] rd = lg.GetLODs();
}
}