GQ_Communicate/GQ_TongXin/Assets/Obi/Scripts/Constraints/ObiAerodynamicConstraints.cs

74 lines
2.0 KiB
C#

using UnityEngine;
using System;
using System.Collections;
using System.Collections.Generic;
namespace Obi{
/**
* Holds information about aerodynamic constraints for an actor.
*/
[DisallowMultipleComponent]
public class ObiAerodynamicConstraints : ObiBatchedConstraints
{
[Tooltip("Air density in kg/m3. Higher densities will make both drag and lift forces stronger.")]
public float airDensity = 1.225f;
[Tooltip("How much is the cloth affected by drag forces. Extreme values can cause the cloth to behave unrealistically, so use with care.")]
public float dragCoefficient = 0.05f;
[Tooltip("How much is the cloth affected by lift forces. Extreme values can cause the cloth to behave unrealistically, so use with care.")]
public float liftCoefficient = 0.05f;
[SerializeField][HideInInspector] private List<ObiAerodynamicConstraintBatch> batches = new List<ObiAerodynamicConstraintBatch>();
public override Oni.ConstraintType GetConstraintType(){
return Oni.ConstraintType.Aerodynamics;
}
public override List<ObiConstraintBatch> GetBatches(){
return batches.ConvertAll(x => (ObiConstraintBatch)x);
}
public void OnValidate(){
airDensity = Mathf.Max(0,airDensity);
dragCoefficient = Mathf.Max(0,dragCoefficient);
liftCoefficient = Mathf.Max(0,liftCoefficient);
}
public override void Clear(){
RemoveFromSolver(null);
batches.Clear();
}
public void AddBatch(ObiAerodynamicConstraintBatch batch){
if (batch != null && batch.GetConstraintType() == GetConstraintType())
batches.Add(batch);
}
public void RemoveBatch(ObiAerodynamicConstraintBatch batch){
batches.Remove(batch);
}
public void OnDrawGizmosSelected(){
if (!visualize) return;
Gizmos.color = Color.blue;
foreach (ObiAerodynamicConstraintBatch batch in batches){
foreach(int i in batch.ActiveConstraints){
Gizmos.DrawWireSphere(actor.GetParticlePosition(batch.aerodynamicIndices[i]),0.01f);
}
}
}
}
}