Формула, чтобы сделать концы рукавов спиральной галактики менее плотными - PullRequest
0 голосов
/ 23 мая 2019

Я хочу сделать спиральную галактику в Unity 3D, используя C # (я использую производную логарифмическую спираль).Я хочу, чтобы конец руки был менее плотным, чем середина, но у меня одинаковая плотность во всем.

Я хочу это:

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 голосов
/ 24 мая 2019

Спасибо, после некоторого поиска и помощи, нужная мне функция называется функцией «спада», но это другая функция спада, например, стандартная функция (квадратичная функция, линейная функция и т. Д.)

Я новичок в этом форуме, и я не знаю, является ли это хорошим ответом, но моя функция падения на самом деле такова: distance = (Mathf.Pow(distance, 1f / 3f) - 1f) / (1-slopeMod);

0 голосов
/ 23 мая 2019

Изменить строку с

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

...