This commit is contained in:
2021-02-01 11:25:34 +08:00
parent 7ee4755a6a
commit e987949600
2 changed files with 43 additions and 14 deletions

View File

@ -29,12 +29,32 @@ public class Fractal : MonoBehaviour
var parent = parents[i / 5];
var part = parts[i];
part.spinAngle += spinAngleDelta;
part.worldRotation = mul(parent.worldRotation,
float3 upAxis =
mul(mul(parent.worldRotation, part.rotation), up());
float3 sagAxis = cross(up(), upAxis);
float sagMagnitude = length(sagAxis);
quaternion baseRotation;
if (sagMagnitude > 0f)
{
sagAxis /= sagMagnitude;
quaternion sagRotation =
quaternion.AxisAngle(sagAxis, part.maxSagAngle * sagMagnitude);
baseRotation = mul(sagRotation, parent.worldRotation);
}
else
{
baseRotation = parent.worldRotation;
}
part.worldRotation = mul(baseRotation,
mul(part.rotation, quaternion.RotateY(part.spinAngle))
);
part.worldPosition =
parent.worldPosition +
mul(parent.worldRotation, 1.5f * scale * part.direction);
mul(part.worldRotation, float3(0f, 1.5f * scale, 0f));
parts[i] = part;
float3x3 r = float3x3(part.worldRotation) * scale;
@ -44,8 +64,9 @@ public class Fractal : MonoBehaviour
private struct FractalPart
{
public float3 direction, worldPosition;
public float3 worldPosition;
public quaternion rotation, worldRotation;
public float maxSagAngle;
public float spinAngle;
}
@ -77,6 +98,12 @@ public class Fractal : MonoBehaviour
[SerializeField]
Color leafColorB = default;
[SerializeField, Range(0f, 90f)]
float maxSagAngleA = 15f;
[SerializeField, Range(0f, 90f)]
float maxSagAngleB = 25f;
static float3[] directions =
{
up(), right(), left(), forward(), back()
@ -93,7 +120,7 @@ public class Fractal : MonoBehaviour
{
return new FractalPart()
{
direction = directions[childIndex],
maxSagAngle = radians(Random.Range(maxSagAngleA, maxSagAngleB)),
rotation = rotations[childIndex]
};
}