我想使用C#在Unity 3D中创建一个螺旋星系(我使用派生的对数螺旋)。我想将手臂的末端设置得比中间的密度小,但是我的手臂在整个末端的密度都相同。
我想要这个:
我目前有这个结果:
我绝对不知道该怎么做,但是用于分散的值是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;
答案 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;
您发布的链接说明了如何平方距离:
现在它开始融合在一起。我们可以在银河系中看到明确定义的手臂,这些明确定义的棘刺从中间向下延伸。此时,您可能会注意到,由于我们的平方运算,臂的进一步区域显得比以前更密。让我们通过将所有恒星拉近中心来解决此问题。距离平方运算,就像我们将恒星拉近距离一样:
说这样做将会从看起来像您当前所拥有的东西中获取输出:
对于您想要的手臂外部比较密度较低的东西:
答案 1 :(得分:0)
谢谢,经过一番搜索和帮助,我需要的函数称为“衰减”函数,但它们是不同的衰减函数,例如标准函数(二次函数,线性函数等)。
我是这个论坛的新手,我不知道它是否是答案的好用法,但我的衰减功能实际上是:distance = (Mathf.Pow(distance, 1f / 3f) - 1f) / (1-slopeMod);