使螺旋星系的臂末端不致密集的公式

时间:2019-05-22 21:23:59

标签: c# unity3d math procedural-generation

我想使用C#在Unity 3D中创建一个螺旋星系(我使用派生的对数螺旋)。我想将手臂的末端设置得比中间的密度小,但是我的手臂在整个末端的密度都相同。

我想要这个:

desired galazy appearance

我目前有这个结果:

actual galaxy appearance

我绝对不知道该怎么做,但是用于分散的值是randomOffsetXY


public int numArms = 5;
public float armOffsetMax = 0.5f;
public float rotationFactor = 5;
public float randomOffsetXY = 0.02f;
public float percentStarInCentre = 5;



for (int i = 0; i < PixelMath.instanceStarCount; i++)
        {
            if(type == GalaxyTypes.Spiral)
            {
                float distance = Random.value;
                distance = Mathf.Pow (distance, PixelMath.percentStarInCentre / 100) ;


                // Choose an angle between 0 and 2 * PI.
                float angle = Random.value * 2 * Mathf.PI;
                float armOffset = Random.value * PixelMath.armsOffetSetMax;

                armOffset = armOffset - PixelMath.armsOffetSetMax / 2;
                armOffset = armOffset * (1 / distance);

                float squaredArmOffset = Mathf.Pow (armOffset, 2);

                if (armOffset < 0)
                    squaredArmOffset = squaredArmOffset * -1;
                armOffset = squaredArmOffset;

                float rotation = distance * PixelMath.rotationFactor;

                // Compute the angle of the arms.
                angle = (int) (angle / armSeparationDistance ) * armSeparationDistance + armOffset + rotation;



                // Convert polar coordinates to 2D cartesian coordinates.
                float starX =  Mathf.Sin (angle) * distance;
                float starZ =  Mathf.Cos (angle) * distance;
                float starY = 0;



2 个答案:

答案 0 :(得分:0)

更改行
distance = Mathf.Pow (distance, PixelMath.percentStarInCentre / 100) ;

第二个参数大于1的东西。

distance = Mathf.Pow (distance, 2f);

或根据您想要的效果的夸张程度

distance = Mathf.Pow (distance, 5f);

如果要在中心减少聚类,则需要线性和抛物线的混合:

float pow
float distance = Random.value;
float slopeMod = 0.8f; // between 0 and 1, higher is more linear
distance = Mathf.Pow(distance, 2f) *(1-slopeMod) + distance*slopeMod;

您发布的链接说明了如何平方距离:

  

现在它开始融合在一起。我们可以在银河系中看到明确定义的手臂,这些明确定义的棘刺从中间向下延伸。此时,您可能会注意到,由于我们的平方运算,臂的进一步区域显得比以前更密。让我们通过将所有恒星拉近中心来解决此问题。距离平方运算,就像我们将恒星拉近距离一样:

说这样做将会从看起来像您当前所拥有的东西中获取输出:

galaxy with dense arms

对于您想要的手臂外部比较密度较低的东西:

galaxy with sparse arms

答案 1 :(得分:0)

谢谢,经过一番搜索和帮助,我需要的函数称为“衰减”函数,但它们是不同的衰减函数,例如标准函数(二次函数,线性函数等)。

我是这个论坛的新手,我不知道它是否是答案的好用法,但我的衰减功能实际上是:distance = (Mathf.Pow(distance, 1f / 3f) - 1f) / (1-slopeMod);