⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tool.cs

📁 Particle System Test Application on C#
💻 CS
📖 第 1 页 / 共 3 页
字号:
						+ 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 + -