📄 tool.cs
字号:
+ lHalfSideLength,
- lHalfSideLength));
Particle l011Particle = new Particle(mass / 6.0f, new Vector3(
- lHalfSideLength,
+ lHalfSideLength,
+ lHalfSideLength));
Particle l100Particle = new Particle(mass / 6.0f, new Vector3(
+ lHalfSideLength,
- lHalfSideLength,
- lHalfSideLength));
Particle l101Particle = new Particle(mass / 6.0f, new Vector3(
+ lHalfSideLength,
- lHalfSideLength,
+ lHalfSideLength));
Particle l110Particle = new Particle(mass / 6.0f, new Vector3(
+ lHalfSideLength,
+ lHalfSideLength,
- lHalfSideLength));
Particle l111Particle = new Particle(mass / 6.0f, new Vector3(
+ lHalfSideLength,
+ lHalfSideLength,
+ lHalfSideLength));
ArrayList lCreatedParticles = new ArrayList();
lCreatedParticles.Add(l000Particle);
lCreatedParticles.Add(l001Particle);
lCreatedParticles.Add(l010Particle);
lCreatedParticles.Add(l011Particle);
lCreatedParticles.Add(l100Particle);
lCreatedParticles.Add(l101Particle);
lCreatedParticles.Add(l110Particle);
lCreatedParticles.Add(l111Particle);
preprocessor.Apply(lCreatedParticles);
constraintFactory.CreateConstraint(transaction, l000Particle, l001Particle);
constraintFactory.CreateConstraint(transaction, l001Particle, l011Particle);
constraintFactory.CreateConstraint(transaction, l011Particle, l010Particle);
constraintFactory.CreateConstraint(transaction, l010Particle, l000Particle);
constraintFactory.CreateConstraint(transaction, l100Particle, l101Particle);
constraintFactory.CreateConstraint(transaction, l101Particle, l111Particle);
constraintFactory.CreateConstraint(transaction, l111Particle, l110Particle);
constraintFactory.CreateConstraint(transaction, l110Particle, l100Particle);
constraintFactory.CreateConstraint(transaction, l100Particle, l000Particle);
constraintFactory.CreateConstraint(transaction, l101Particle, l001Particle);
constraintFactory.CreateConstraint(transaction, l111Particle, l011Particle);
constraintFactory.CreateConstraint(transaction, l110Particle, l010Particle);
constraintFactory.CreateConstraint(transaction, l000Particle, l111Particle);
constraintFactory.CreateConstraint(transaction, l001Particle, l110Particle);
constraintFactory.CreateConstraint(transaction, l010Particle, l101Particle);
constraintFactory.CreateConstraint(transaction, l011Particle, l100Particle);
AddParticlesToTransaction(lCreatedParticles, transaction);
return ConvertArrayListToParticleList(lCreatedParticles);
}
/// <summary>
/// Creates a stiff box. In contrast to the "wobbly" box this
/// box constraints are chosen so that its easier for the
/// particle system to relax its constraints
/// </summary>
/// <param name="centerPosition">Center position of box</param>
/// <param name="mass">Mass of box</param>
/// <param name="sideLength">Sidelength of box</param>
/// <param name="constraintFactory">A constraint factory</param>
/// <param name="transaction">A transaction</param>
/// <returns>An array of particles that was created</returns>
public static Particle[] CreateBox(
Vector3 centerPosition,
float mass,
float sideLength,
ITwoParticleConstraintFactory constraintFactory,
ParticleSystem.Transaction transaction)
{
if( !(sideLength > float.Epsilon) )
{
throw new Exception("sideLength parameter must be greater than 0");
}
Matrix lScaleMatrix =
Matrix.Scaling(sideLength, sideLength, sideLength);
Matrix lTranslationMatrix =
Matrix.Translation(centerPosition);
return CreateBox(
mass,
lScaleMatrix * lTranslationMatrix,
constraintFactory,
transaction);
}
/// <summary>
/// Creates a stiff box. In contrast to the "wobbly" box this
/// box constraints are chosen so that its easier for the
/// particle system to relax its constraints
/// </summary>
/// <param name="mass">Mass of box</param>
/// <param name="transformMatrix">Matrix used to transform particles positions</param>
/// <param name="constraintFactory">A constraint factory</param>
/// <param name="transaction">A transaction</param>
/// <returns>An array of particles that was created</returns>
public static Particle[] CreateBox(
float mass,
Matrix transformMatrix,
ITwoParticleConstraintFactory constraintFactory,
ParticleSystem.Transaction transaction)
{
return CreateBox(
mass,
new MatrixTransformParticlePreProcessor(transformMatrix),
constraintFactory,
transaction);
}
/// <summary>
/// Creates a stiff box. In contrast to the "wobbly" box this
/// box constraints are chosen so that its easier for the
/// particle system to relax its constraints
/// </summary>
/// <param name="mass">Mass of box</param>
/// <param name="preprocessor">Preprocessor applied to all created particles</param>
/// <param name="constraintFactory">A constraint factory</param>
/// <param name="transaction">A transaction</param>
/// <returns>An array of particles that was created</returns>
public static Particle[] CreateBox(
float mass,
IParticlePreProcessor preprocessor,
ITwoParticleConstraintFactory constraintFactory,
ParticleSystem.Transaction transaction)
{
if( !(mass > float.Epsilon) )
{
throw new Exception("mass parameter must be greater than 0");
}
float lHalfSideLength = 0.5f;
Particle l000Particle = new Particle(mass / 6.0f, new Vector3(
- lHalfSideLength,
- lHalfSideLength,
- lHalfSideLength));
Particle l001Particle = new Particle(mass / 6.0f, new Vector3(
- lHalfSideLength,
- lHalfSideLength,
+ lHalfSideLength));
Particle l010Particle = new Particle(mass / 6.0f, new Vector3(
- lHalfSideLength,
+ lHalfSideLength,
- lHalfSideLength));
Particle l011Particle = new Particle(mass / 6.0f, new Vector3(
- lHalfSideLength,
+ lHalfSideLength,
+ lHalfSideLength));
Particle l100Particle = new Particle(mass / 6.0f, new Vector3(
+ lHalfSideLength,
- lHalfSideLength,
- lHalfSideLength));
Particle l101Particle = new Particle(mass / 6.0f, new Vector3(
+ lHalfSideLength,
- lHalfSideLength,
+ lHalfSideLength));
Particle l110Particle = new Particle(mass / 6.0f, new Vector3(
+ lHalfSideLength,
+ lHalfSideLength,
- lHalfSideLength));
Particle l111Particle = new Particle(mass / 6.0f, new Vector3(
+ lHalfSideLength,
+ lHalfSideLength,
+ lHalfSideLength));
ArrayList lCreatedParticles = new ArrayList();
lCreatedParticles.Add(l000Particle);
lCreatedParticles.Add(l001Particle);
lCreatedParticles.Add(l010Particle);
lCreatedParticles.Add(l011Particle);
lCreatedParticles.Add(l100Particle);
lCreatedParticles.Add(l101Particle);
lCreatedParticles.Add(l110Particle);
lCreatedParticles.Add(l111Particle);
preprocessor.Apply(lCreatedParticles);
constraintFactory.CreateConstraint(transaction, l000Particle, l001Particle);
constraintFactory.CreateConstraint(transaction, l001Particle, l011Particle);
constraintFactory.CreateConstraint(transaction, l011Particle, l010Particle);
constraintFactory.CreateConstraint(transaction, l010Particle, l000Particle);
constraintFactory.CreateConstraint(transaction, l100Particle, l101Particle);
constraintFactory.CreateConstraint(transaction, l101Particle, l111Particle);
constraintFactory.CreateConstraint(transaction, l111Particle, l110Particle);
constraintFactory.CreateConstraint(transaction, l110Particle, l100Particle);
constraintFactory.CreateConstraint(transaction, l100Particle, l000Particle);
constraintFactory.CreateConstraint(transaction, l101Particle, l001Particle);
constraintFactory.CreateConstraint(transaction, l111Particle, l011Particle);
constraintFactory.CreateConstraint(transaction, l110Particle, l010Particle);
constraintFactory.CreateConstraint(transaction, l000Particle, l011Particle);
constraintFactory.CreateConstraint(transaction, l000Particle, l110Particle);
constraintFactory.CreateConstraint(transaction, l000Particle, l101Particle);
constraintFactory.CreateConstraint(transaction, l111Particle, l001Particle);
constraintFactory.CreateConstraint(transaction, l111Particle, l010Particle);
constraintFactory.CreateConstraint(transaction, l111Particle, l100Particle);
AddParticlesToTransaction(lCreatedParticles, transaction);
return ConvertArrayListToParticleList(lCreatedParticles);
}
private static void ConnectVerticalParticles(
ArrayList particles,
int numberOfParticlesAlongYAxis,
ITwoParticleConstraintFactory constraintFactory,
ParticleSystem.Transaction transaction)
{
int lCurrentParticle = 0;
Particle lPreviousParticle = null;
foreach(Particle lParticle in particles)
{
if( lCurrentParticle % numberOfParticlesAlongYAxis != 0 )
{
constraintFactory.CreateConstraint(
transaction,
lPreviousParticle,
lParticle);
}
lPreviousParticle = lParticle;
++lCurrentParticle;
}
}
private static void ConnectHorizontalParticles(
ArrayList particles,
int numberOfParticlesAlongXAxis,
int numberOfParticlesAlongYAxis,
ITwoParticleConstraintFactory constraintFactory,
ParticleSystem.Transaction transaction)
{
for(int lXIndex = 1; lXIndex < numberOfParticlesAlongXAxis; ++lXIndex)
{
for(int lYIndex = 0; lYIndex < numberOfParticlesAlongYAxis; ++lYIndex)
{
Particle lPreviousParticle =
(Particle)particles[lYIndex + (lXIndex - 1)* numberOfParticlesAlongYAxis];
Particle lParticle =
(Particle)particles[lYIndex + lXIndex * numberOfParticlesAlongYAxis];
constraintFactory.CreateConstraint(
transaction,
lPreviousParticle,
lParticle);
}
}
}
/// <summary>
/// Creates a mesh of particles that can be used a sails and
/// trampolines for instance. The mesh is oriented in the X-Y
/// plane
/// </summary>
/// <param name="mass">Mass of mesh</param>
/// <param name="numberOfParticlesAlongXAxis">Number of particles along the mesh X-axis</param>
/// <param name="numberOfParticlesAlongYAxis">Number of particles along the mesh Y-axis</param>
/// <param name="transformMatrix">Matrix to transform the mesh particles with</param>
/// <param name="constraintFactory">A constraint factory</param>
/// <param name="transaction">A transaction</param>
/// <returns></returns>
public static Particle[] CreateMesh(
float mass,
int numberOfParticlesAlongXAxis,
int numberOfParticlesAlongYAxis,
Matrix transformMatrix,
ITwoParticleConstraintFactory constraintFactory,
ParticleSystem.Transaction transaction)
{
return CreateMesh(
mass,
numberOfParticlesAlongXAxis,
numberOfParticlesAlongYAxis,
new MatrixTransformParticlePreProcessor(transformMatrix),
constraintFactory,
transaction);
}
/// <summary>
/// Creates a mesh of particles that can be used a sails and
/// trampolines for instance. The mesh is oriented in the X-Y
/// plane
/// </summary>
/// <param name="mass">Mass of mesh</param>
/// <param name="numberOfParticlesAlongXAxis">Number of particles along the mesh X-axis</param>
/// <param name="numberOfParticlesAlongYAxis">Number of particles along the mesh Y-axis</param>
/// <param name="preprocessor">Preprocessor applied to all created particles</param>
/// <param name="constraintFactory">A constraint factory</param>
/// <param name="transaction">A transaction</param>
/// <returns></returns>
public static Particle[] CreateMesh(
float mass,
int numberOfParticlesAlongXAxis,
int numberOfParticlesAlongYAxis,
IParticlePreProcessor preprocessor,
ITwoParticleConstraintFactory constraintFactory,
ParticleSystem.Transaction transaction)
{
if( !(mass > float.Epsilon) )
{
throw new Exception("mass parameter must be greater than 0");
}
if( numberOfParticlesAlongXAxis < 2 )
{
throw new Exception("links parameter must be greater than 1");
}
if( numberOfParticlesAlongYAxis < 2 )
{
throw new Exception("links parameter must be greater than 1");
}
float lMassPerParticle = mass /
(numberOfParticlesAlongXAxis * numberOfParticlesAlongYAxis);
Vector3 lXStep = new Vector3(1.0f / (numberOfParticlesAlongXAxis - 1), 0.0f, 0.0f);
Vector3 lYStep = new Vector3(0.0f, 1.0f / (numberOfParticlesAlongYAxis - 1), 0.0f);
Vector3 lBorderPosition = new Vector3(-0.5f, -0.5f, 0.0f);
ArrayList lCreatedParticles = new ArrayList();
for( int lX = 0; lX < numberOfParticlesAlongXAxis; ++lX )
{
Vector3 lIterationPosition = lBorderPosition;
for( int lY = 0; lY < numberOfParticlesAlongYAxis; ++lY )
{
lCreatedParticles.Add(
new Particle(
lMassPerParticle,
lIterationPosition));
lIterationPosition.Add(lYStep);
}
lBorderPosition.Add(lXStep);
}
preprocessor.Apply(lCreatedParticles);
ConnectVerticalParticles(
lCreatedParticles,
numberOfParticlesAlongYAxis,
constraintFactory,
transaction);
ConnectHorizontalParticles(
lCreatedParticles,
numberOfParticlesAlongXAxis,
numberOfParticlesAlongYAxis,
constraintFactory,
transaction);
AddParticlesToTransaction(lCreatedParticles, transaction);
return ConvertArrayListToParticleList(lCreatedParticles);
}
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -